/\b(keyword|whatever)\b/gi
各単語の最初の出現のみに一致するように上記の JavaScript 正規表現を変更するにはどうすればよいですか (これは非貪欲と呼ばれると思います)。
「keyword」の最初の出現と「whatever」の最初の出現で、そこにさらに多くの単語を入れることができます。
/\b(keyword|whatever)\b/gi
各単語の最初の出現のみに一致するように上記の JavaScript 正規表現を変更するにはどうすればよいですか (これは非貪欲と呼ばれると思います)。
「keyword」の最初の出現と「whatever」の最初の出現で、そこにさらに多くの単語を入れることができます。
正規表現からフラグを削除g
します。
/\b(keyword|whatever)\b/i
あなたがしていることは、単一の正規表現では単純に達成できません。代わりに、検索したいすべての単語を配列に格納し、それらすべてをループして回答を検索し、一致する単語をすべて配列に格納する必要があります。
例:
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
}
正規表現からg修飾子を削除します。次に、一致するものが1つだけ見つかります。
あなたが話していることは、JavaScript 正規表現では実行できません。.NET の無制限の後読みなどの高度な正規表現機能を使用すれば可能かもしれませんが、JavaScript の機能セットは非常に限られています。.NET でも、単語ごとに個別の正規表現を作成し、それらを 1 つずつ適用するのがおそらく最も簡単でしょう。JavaScript では、これが唯一のオプションです。
貪欲さは、 などの量指定子を使用する正規表現にのみ適用され/START.*END/
ます。は.
「任意の文字」を*
意味し、は「0 個以上」を意味します。が見つかった後、START
は.*
貪欲に残りのテキストを消費します。次に、バックトラックを開始し、正規表現の次の部分がEND
一致するまで、一度に 1 文字ずつ「返して」いきます。
の最初の出現からSTART
最後のEND
.
複数の "START" から "END" へのシーケンスが存在する可能性があり、最初の 1 つだけに一致させたい場合は、 に a?
を追加し*
て非貪欲にすることができます/START.*?END/
。.
が次の文字を消費しようとするたびに、代わりにその場所で一致するかどうかを最初に確認します。END
したがって、最初START
からその後の最初まで一致END
します。また、「START」から「END」までのすべてのシーケンスを個別に一致させたい場合は、「g」修飾子を追加します/START.*?END/g
。
もちろん、それよりも少し複雑です。たとえば、次のように、これらのシーケンスをネストできるとしたらどうSTART…START…END…END
でしょうか。この答えに少し夢中になったのは、貪欲さを理解することが正規表現を習得するための最初の重要なステップだからです。:-/