/\b(keyword|whatever)\b/gi
どのように私は上記のjavascriptの正規表現を各単語の最初の出現と一致するように変更できますか(これは非貪欲型です)?regexを各マッチの最初のオカレンスだけにマッチさせる方法は?
"キーワード"の最初の出現と "何でも"の最初の出現と私はそこにもっと多くの言葉を入れるかもしれません。
/\b(keyword|whatever)\b/gi
どのように私は上記のjavascriptの正規表現を各単語の最初の出現と一致するように変更できますか(これは非貪欲型です)?regexを各マッチの最初のオカレンスだけにマッチさせる方法は?
"キーワード"の最初の出現と "何でも"の最初の出現と私はそこにもっと多くの言葉を入れるかもしれません。
何が単数の正規表現と単純に実現不可能です。代わりに、配列内に見つけたいすべての単語を格納し、それらをすべてループして答えを探し、次に一致するものを配列に格納する必要があります。
例:
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
}
regexからg修飾子を削除します。そうすれば、1つのマッチしか見つけることができません。
あなたの正規表現からg
フラグを削除します。あなたがやっている
/\b(keyword|whatever)\b/i
何が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
のように、これらのシーケンスをネストすることができますか?私がこの答えで少し疎遠になってしまったのは、貪欲を理解することが正規表現をマスターするための最初の重要なステップだからです。 :/
「キーワード」の最初の出現箇所と「何か」の最初の出現箇所を検索する場合は、おそらく2つの正規表現を使用することをお勧めします。 "Greedy"と "Non-Greedy"は、 "。"のような一致するワイルドカードを指します。 –
@DavidGorslineそれは私がやりたいことですが、多分2つではなく無数の言葉があります。 – ofko