Как сделать так, чтобы регулярное выражение совпадало только с первым появлением каждого совпадения?

<code>/\b(keyword|whatever)\b/gi
</code>

Как я могу изменить вышеупомянутое регулярное выражение javascript, чтобы соответствовать только первому вхождению каждого слова (я полагаю, это называется не жадным)?

Первое появление ключевого слова & quot; и первое появление «что бы то ни было»; и я могу добавить больше слов.

 ofko13 апр. 2012 г., 18:16
@ DavidGorsline Это то, что я хочу сделать, но может быть неопределенное количество слов, а не только два.
 David Gorsline13 апр. 2012 г., 17:53
Если вы хотите найти первое вхождение «ключевого слова» и первое вхождение «чего угодно», то вам лучше всего использовать 2 регулярных выражения. «Жадный» и «не жадный» относятся к соответствующим символам подстановки, например «.».

Ответы на вопрос(4)

о чем ты говоришь, нельзя сделать с помощью регулярного выражения JavaScript. Это может быть возможно с помощью расширенных функций регулярных выражений, таких как неограниченный просмотр .NET, но набор функций JavaScript крайне ограничен. И даже в .NET было бы проще всего создать отдельное регулярное выражение для каждого слова и применять их одно за другим; в JavaScript это ваш единственный вариант.

Жадность применяется только к регулярным выражениям, использующим квантификаторы, например/START.*END/.. означает «любой символ», а символ* означает «ноль или больше». ПослеSTART находится,.* жадно поглощает остальную часть текста. Затем он начинает возвращаться назад, «возвращая» по одному символу за раз до следующей части регулярного выражения,END удалось сопоставить.
Мы называем это регулярное выражение «жадным», потому что оно совпадает со всем с первого появленияSTART до последнего появленияEND.

Если может быть несколько последовательностей «START» - «END», и вы хотите сопоставить только первую, вы можете добавить? на* чтобы сделать его нежадным:/START.*?END/. Теперь каждый раз, когда. пытается использовать следующий символ, этопервы проверяет, может ли оно совпадатьEND вместо этого. Таким образом, это соответствует с первогоSTART до первогоEND после того. И если вы хотите сопоставить все последовательности «START» - «END» по отдельности, добавьте модификатор «g»:/START.*?END/g.

Конечно, все немного сложнее. Например, что если эти последовательности могут быть вложенными, как вSTART…START…END…END? Если я немного увлекся этим ответом, то это потому, что понимание жадности - это первый важный шаг к овладению регулярными выражениями. : - /

Решение Вопроса

что ты делаешь, просто недостижимо с единичным регулярным выражением. Вместо этого вам придется хранить каждое слово, которое вы хотите найти в массиве, проходить по ним все в поисках ответа, а затем для любых совпадений сохранять результат в массиве.

Пример

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
}
 ofko13 апр. 2012 г., 18:23
Я мог бы использовать более одного, если мне нужно, какой другой вариант?
 ofko13 апр. 2012 г., 18:15
Думаю, мой вопрос был неясным. Я на самом деле хочу, чтобы в скобках было первое вхождение каждого слова, как сказал Дэвид. Там может быть неопределенное количество слов в скобках.
 ofko13 апр. 2012 г., 18:45
О, я думаю, я понимаю, что ты имеешь в виду: перебрать термины, которые я хочу сопоставить, и запустить одно и то же регулярное выражение для каждого. Я думаю, что попробую это, но я не уверен, насколько это эффективно.
 Randy the Dev13 апр. 2012 г., 18:52
Я обновил свой ответ
 Randy the Dev13 апр. 2012 г., 18:18
Хорошо, то, что вы пытаетесь достичь, невозможно с помощью одного регулярного выражения. Вы должны использовать одно регулярное выражение?

Удалятьg флаг из вашего регулярного выражения:

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

только одно совпадение.

Ваш ответ на вопрос