JavaScript RegExp: могу ли я получить последний сопоставленный индекс или искать назад/RightToLeft?

Предположим, что у меня есть строка

foo bar baz foo bar baz foo bar baz foo bar baz 

Я хочу найти последний штрих в баре, как я могу это сделать? Нужно ли цитировать дополнительные совпадения? В .NET я могу сделать поиск RightToLeft в JS, я думаю, что не могу?

Ответ 1

bar(?!.*bar)

найдет последний bar в строке:

bar   # Match bar
(?!   # but only if it not followed by...
 .*   # zero or more characters
 bar  # literal bar
)     # end of lookahead

Если ваша строка может содержать символы новой строки, используйте

bar(?![\s\S]*bar)

вместо этого. [\s\S] соответствует любому символу, включая символы новой строки.

Например:

match = subject.match(/bar(?![\s\S]*bar)/);
if (match != null) {
    // matched text: match[0]
    // match start: match.index
}

Вы также можете объединить ваши слова поиска (если они действительно слова, состоящие из буквенно-цифровых символов) с якорями \b, чтобы избежать частичных совпадений.

\bbar\b(?![\s\S]*\bbar\b)

совпадает с одиночным bar вместо bar внутри foobar:

Don't match bar, do match bar, but not foobar!
  no match---^     match---^    no match---^

Ответ 2

Используйте встроенную функцию lastIndexOf:

"foo bar baz foo bar baz foo bar baz foo bar baz".lastIndexOf("bar");

Если вы хотите найти последнее слово "bar":

(" "+"foo bar baz foo bar baz foo bar baz foo bar baz"+" ").lastIndexOf(" bar ");