Как я могу найти последнее вхождение слова со словом границы? Я создал выражение регулярного выражения /\btotal\b/
для слова. Как использовать поиск(), чтобы найти последнее вхождение этого выражения? Заранее спасибо за помощь!Найти последнее появление регулярных выражений Word
ответ
Вы можете использовать отрицательный предпросмотр, чтобы получить последний матч:
/(\btotal\b)(?!.*\b\1\b)/
(?!.*\1)
отрицательный предпросмотр утверждать, скопировавшей группу № 1 т.е. total
слова нет впереди настоящего матча.
Ответ лежит на функции движка регулярных выражений, называемом 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);
без использования lookaheads, но с использованием того же регулярного выражения (Применив g
, т.е. глобальный, флаг), то вариант будет соответствовать строка с регулярным выражением и получить последний матч.
var matches = yourString.match(/\btotal\b/g);
var lastMatch = matches[matches.length-1];
Я попробовал демо, но раздел информации матча на сайте с вашим демо говорит:. «Не было добыто ни одного совпадения групп Это означает, что шаблон совпадает, но были нет (захвата (группы)) в ней который соответствовал чему-либо в строке темы. " Мне было интересно, что это значит?Я прошу, потому что я попробовал ваш метод, но я получаю -1, когда я использую его с функцией поиска в строке, которая показывает совпадения на regex101.com. –
Я иногда получаю два матча? Как это происходит, если это находит последнюю сумму? –
Здесь я получаю два совпадения: https://regex101.com/r/lI0fF7/4 –