2012-04-13 13 views
2
/\b(keyword|whatever)\b/gi 

どのように私は上記のjavascriptの正規表現を各単語の最初の出現と一致するように変更できますか(これは非貪欲型です)?regexを各マッチの最初のオカレンスだけにマッチさせる方法は?

"キーワード"の最初の出現と "何でも"の最初の出現と私はそこにもっと多くの言葉を入れるかもしれません。

+0

「キーワード」の最初の出現箇所と「何か」の最初の出現箇所を検索する場合は、おそらく2つの正規表現を使用することをお勧めします。 "Greedy"と "Non-Greedy"は、 "。"のような一致するワイルドカードを指します。 –

+0

@DavidGorslineそれは私がやりたいことですが、多分2つではなく無数の言葉があります。 – ofko

答えて

4

何が単数の正規表現と単純に実現不可能です。代わりに、配列内に見つけたいすべての単語を格納し、それらをすべてループして答えを探し、次に一致するものを配列に格納する必要があります。

例:

var words = ["keyword","whatever"]; 
var text = "Whatever, keywords are like so, whatever... Unrelated, I now know " + 
      "what it's like to be a tweenage girl. Go Edward."; 
var matches = []; // An empty array to store results in. 
/* When you search the text you need to convert it to lower case to make it 
    searchable. 
* We'll be using the built in method 'String.indexOf(needle)' to match 
    the strings as it avoids the need to escape the input for regular expression 
    metacharacters. */ 

//Text converted to lower case to allow case insensitive searchable. 
var lowerCaseText = text.toLowerCase(); 
for (var i=0;i<words.length;i++) { //Loop through the `words` array 
    //indexOf returns -1 if no match is found 
    if (lowerCaseText.indexOf(words[i]) != -1) 
     matches.push(words[i]); //Add to the `matches` array 
} 
+0

私の質問ははっきりしないと思います。ダビデが言ったように、私は実際にカッコ内の各単語の最初の出現を望んでいます。括弧内に不特定多数の単語があるかもしれません。 – ofko

+0

さて、あなたが達成しようとしていることは、1つの正規表現では不可能です。単一の正規表現を使用する必要がありますか? –

+0

もし私が持っていれば複数のオプションを使うことができますが、他のオプションは何ですか? – ofko

3

regexからg修飾子を削除します。そうすれば、1つのマッチしか見つけることができません。

2

あなたの正規表現からgフラグを削除します。あなたがやっている

/\b(keyword|whatever)\b/i 
0

何がJavaScriptの正規表現で行うことができない話をしています。 .NETの無制限のlookbehindのような高度なregex機能では可能かもしれませんが、JavaScriptの機能セットは非常に限られています。そして.NETでさえ、単語ごとに別々の正規表現を作成し、それを一つずつ適用するのがおそらく最も簡単でしょう。 JavaScriptでは、あなたの唯一の選択肢です。

貪欲は、/START.*END/のような量指定子を使用する正規表現にのみ適用されます。 .は「任意の文字」を意味し、*は「ゼロ以上」を意味します。 STARTが見つかった後、.*は欲張りに残りのテキストを消費します。次に、正規表現の次の部分であるENDが一致するまで、一度に1文字ずつ "返す"バックトラックを開始します。
STARTの最初の出現からENDの最後の出現までのすべてに一致するため、この正規表現は「greedy」と呼ばれます。 /START.*?END/:そこに複数の「START」-to-「END」配列であること、そしてあなただけの最初のものと一致することをお勧めします場合は

は、あなたはそれが非貪欲にするために?*に追加することができます。今度は、.が次の文字を消費しようとする度に、最初にがその場所にENDと一致するかどうかを確認します。したがって、最初のSTARTから最初のENDに一致します。また、 "START"から "END"までのすべてのシーケンスを個別にマッチさせたい場合は、 'g'修飾子を追加します:/START.*?END/g

それはもちろん、それより少し複雑です。たとえば、START…START…END…ENDのように、これらのシーケンスをネストすることができますか?私がこの答えで少し疎遠になってしまったのは、貪欲を理解することが正規表現をマスターするための最初の重要なステップだからです。 :/