5
/\b(keyword|whatever)\b/gi

各単語の最初の出現のみに一致するように上記の JavaScript 正規表現を変更するにはどうすればよいですか (これは非貪欲と呼ばれると思います)。

「keyword」の最初の出現と「whatever」の最初の出現で、そこにさらに多くの単語を入れることができます。

4

4 に答える 4

7

正規表現からフラグを削除gします。

/\b(keyword|whatever)\b/i
于 2012-04-13T15:44:23.053 に答える
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
}
于 2012-04-13T15:44:28.157 に答える
3

正規表現からg修飾子を削除します。次に、一致するものが1つだけ見つかります。

于 2012-04-13T15:44:16.160 に答える
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でしょうか。この答えに少し夢中になったのは、貪欲さを理解することが正規表現を習得するための最初の重要なステップだからです。:-/

于 2012-04-13T17:40:19.563 に答える