2016-07-20 3 views
3

Как я могу найти последнее вхождение слова со словом границы? Я создал выражение регулярного выражения /\btotal\b/ для слова. Как использовать поиск(), чтобы найти последнее вхождение этого выражения? Заранее спасибо за помощь!Найти последнее появление регулярных выражений Word

ответ

5

Вы можете использовать отрицательный предпросмотр, чтобы получить последний матч:

/(\btotal\b)(?!.*\b\1\b)/ 

RegEx Demo 1

RegEx Demo 2

(?!.*\1) отрицательный предпросмотр утверждать, скопировавшей группу № 1 т.е. total слова нет впереди настоящего матча.

+0

Я попробовал демо, но раздел информации матча на сайте с вашим демо говорит:. «Не было добыто ни одного совпадения групп Это означает, что шаблон совпадает, но были нет (захвата (группы)) в ней который соответствовал чему-либо в строке темы. " Мне было интересно, что это значит?Я прошу, потому что я попробовал ваш метод, но я получаю -1, когда я использую его с функцией поиска в строке, которая показывает совпадения на regex101.com. –

+0

Я иногда получаю два матча? Как это происходит, если это находит последнюю сумму? –

+0

Здесь я получаю два совпадения: https://regex101.com/r/lI0fF7/4 –

7

Ответ лежит на функции движка регулярных выражений, называемом Negative Lookahead.

Отрицательный Lookahead - это функция поиска регулярных выражений, которая относится к grouop функций, которые не выбирают соответствующий текст. Отрицательный lookahead позволяет вам сопоставить шаблон, за которым не следует другой шаблон.

Допустим, у нас есть пример строка с несколькими повторяющихся экземплярами текста аЬса:

abcaaaaaaaabcbbbbabc111111abc22 

Если мы хотим, чтобы соответствовать последнему экземпляру строки аЬса, то мы можем использовать отрицательный предпросмотр, который ищет текст abc, и за этим не следует какой-либо текст abc. В регулярном выражении это записывается как:

abc(?!.*abc) 

В этом выражении первый символ abc соответствует шаблону. Так как в нашем примере есть много примеров abc, нам понадобится отрицательный lookahead, чтобы помочь нам найти только последний экземпляр abc ... другими словами, экземпляр abc, где нет следующих экземпляров abc. Это делается с использованием подстановочного текстового соответствия:. *, За которым следует строка abc.

Пример в JavaScript

В более практическом примере, скажем, у нас есть области ввода текста HTML на нашем веб-страницы следующим образом:

<input type="text" id="myText" value="the fox once said hello to the fox in the glen"> 

Если мы хотим написать функцию JavaScript, которая будет возьмите значение области ввода текста и измените значение как предупреждение пользователю, мы могли бы написать функцию для этого. Скажем в этом примере, что лиса поздоровалась с ястребом, а не с другой лисой. Чтобы выполнить эту замену, нам нужно будет заменить последний экземпляр слова fox в нашей строке.

var myTextValue = document.getElementById('myText').value; 
var strOutText = 'initial: ' + myTextValue + '\r\n'; 
var strModText = strOutText.replace(/fox(?!.*fox)/, 'hawk'); 
strOutText += 'modified: ' +strModText; 
alert(strOutText); 
3

без использования lookaheads, но с использованием того же регулярного выражения (Применив g, т.е. глобальный, флаг), то вариант будет соответствовать строка с регулярным выражением и получить последний матч.

var matches = yourString.match(/\btotal\b/g); 
var lastMatch = matches[matches.length-1]; 
+0

На самом деле с модификатором 'g'lobal включен. – revo

+0

@revo Действительно, забыли об этом. – nicael