2016-11-16 16 views
0

特定のIDを含む特定の行の単語数をカウントします(たとえば、* AUY)。これまでのところ、私はラインを見つけるために、以下の正規表現を使用して試してみましたが、それは特定の単語で始まる行の単語数をカウントします。

*AUY: today is holiday so Peter and Mary do not need to go to work . 
%mor: n|today cop|be&3s n|holiday conj|so n:prop|Peter conj|and n:prop|Mary v|do neg|not v|need inf|to v|go prep|to n|work . 
%snd: <00:00:00><00:07:37> 
%AUY: ok_pfp (0.40) er today is holiday errfr ::: so er Peter and Mary {is} ~ er do not need errfr ::: to go to work . errfr :;:a | 

結果は最初でなければなりません、私はテスト文字列の下に持って

^ *(.*\b(?:\\*AUY)\b.*) *$ 

開始時に「*」を考慮していません結果の一致の最初と最後の文字列を返します。これはRubular

+1

質問をより明確にすることはできますか?あなたが提供したテスト文字列から何を抽出しようとしていますか? – MYGz

+0

'string.split( '').length'を実行するだけです。 – Rajesh

+0

あなたのスクリプトは文字列にマッチするだけですが、単語は数えません。文字列にマッチする必要があるのは '^ \ * AUY。*'です。これはあなたが探しているものですか?文字列中の単語の数を数えるためにあなたが試したコードは何ですか? –

答えて

2

それを試してみてください :

/^.*?\*AUY:(.*?)$/gmi 

Explanation

  1. は^ライン
  2. の開始位置をアサート*。?任意の文字に一致します(行終端文字を除く)
  3. *?数量詞 - ゼロと無限の時間(遅延)とのマッチ
  4. \ *文字*
  5. AUYが一致します。文字AUY
  6. *と一致しますか。?任意の文字に一致します(行終端文字を除く)
  7. 行末に$をアサートします。
  8. g修飾子:global。最初の試合後に戻らない
  9. m修飾語:複数行。原因^と$各行 の開始/終了を一致させるために(だけではなく、文字列の始め/終わり)
  10. I修飾子:小文字を区別しない

Rubular

コードサンプル:

function countWord(){ 

const regex = /^.*?\*AUY:(.*?)$/gmi; 
const str = `*AUY: today is holiday so Peter and Mary do not need to go to work . 
%mor: n|today cop|be&3s n|holiday conj|so n:prop|Peter conj|and n:prop|Mary v|do neg|not v|need inf|to v|go prep|to n|work . 
%snd: <00:00:00><00:07:37> 
%AUY: ok_pfp (0.40) er today is holiday errfr ::: so er Peter and Mary {is} ~ er do not need errfr ::: to go to work . errfr :;:a |`; 
let m; 

while ((m = regex.exec(str)) !== null) { 
    // This is necessary to avoid infinite loops with zero-width matches 
    if (m.index === regex.lastIndex) { 
     regex.lastIndex++; 
    } 
    alert(m[1].match(/\b(\w+)\b/g).length); 
} 

    } 
+0

Thanku Maverick、それはうまくいったのですが、これらのマッチした行をどのようにループし、その中に ? –

+0

@BilalHussainあなたの質問はより明確になったはずですが、AUYの後の言葉の数を数えたいと思っています:更新されたサンプルコードを見てください –

+0

Thanku soo多くのMaverickは私が正確に探していたものでした:) –

0

次の正規表現を使用してください:

(^.*\*AUY.*$) 

あなたはcheck it here

3

xとすることができます。

文字列 '* AUY'で始まる各行内の単語のような構造の数の配列を返します。

説明:

正規表現は、その行がの先頭でない場合であっても行の先頭で、すなわち(文字列の先頭に、または直接任意の改行の後AUY *文字列を検索します文字列)、および* AUYの最初のトークンに続く任意の非CRLF文字(つまり、その行の残りの部分)。

一致が行われた後のイディオム|| []は、一致値がnullの場合は空の配列を返し、null値の代わりに配列が必要な場合のエラーを防止します。

最終ステップ.mapは、一致した配列の各要素に対して作用し、空白以外の一致をカウントし、これらのカウントを新しい配列として返します。イディオムでこの一致を保護する必要はないことに注意してください。なぜなら、行には少なくとも空白以外の文字列* AUYが含まれているためです。

実際にやりたいことを行うための出発点としてこのコードを使用できます。がんばろう!

+0

感謝してくれたJoesphさん、私は「* AUY:」の後の文字を数えたいと思います。今のところ、このような文字列を数えています(「↵* AUY:\t突然彼女は叫んで電球が燃え尽きていると言いました」)。 –

+0

@BilalHussain Lol、よろしくお願いします!あなたは '' return s.match(/ \ S +/g).length - 1'を引くだけです。 –

関連する問題