Dark_Knight
@Dark_Knight
Game Dev

Почему не корректно работает регулярка?

Здравствуйте, такой вопрос:
Есть регулярка, которая ищет в строке слово(hello) и если находит его, то обрамляет тегами стронг. Но почему то, она при нахождении hello, код захватывает и следующий символ.
function getStrongText(value) {
	var str = 'Hello world hello123',
		pattern = "([^{L}]|^)Hello([^{L}]|$)".replace(/{L}/g),
		regex = new RegExp(pattern, "gi"),		
		text = str.replace(regex, "<strong>$&</strong>");
		
	console.log(text); /* <strong>Hello </strong>world<strong> hello1</strong>23 - Как видите в последний hello попала цифра 1*/

}	
getStrongText();

Подскажите, почему так?
  • Вопрос задан
  • 274 просмотра
Решения вопроса 1
PretorDH
@PretorDH
HTML5, CSS3, PHP, JS - люблю в чистом виде.
Используй онлайн тестер: Например.
И старайся упрощать... а не усложнять.

function getStrongText(value) {
  var str = 'Hello world hello123',
  regex = new RegExp(value, "gi");
  return str.replace(regex, '<strong>$&</strong>');
}	
console.log(getStrongText('Hello'));


Если нужно искать только слова, а не части слов то нужно делать слегка иначе.

function getStrongText(value) {
  var str = 'Hello, world hello123',
    pattern = "(\s|^)"+value+"(\W|\s|$)",
    regex = new RegExp(pattern, "gi");
    return str.replace(regex, "$1<strong>$2</strong>$3");   
}	
console.log( getStrongText('hello') );


В твоем примере замена производилась трёх значений. $& значит все найденные субпатерны в одной итерации, а у тебя три субпатерна.
<strong>$&</strong> все равно, что <strong>$1$2$3</strong>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
при нахождении hello, код захватывает и следующий символ

И следующий и предыдущий.
Потому что у вас в регулярке так и написано:
([^{L}]|^) сохранить в подмаску не {L} или символ начала строки
И после ([^{L}]|$) - сохранить в другую подмаску не {L} или символ конца строки.
Здесь уместнее негативные ретроспективные и опережающие проверки. Но JS не умеет ретроспективную проверку.

Если нет желания читать "Регулярные выражения" Джеффри Фридла (хотя весьма рекомендую) то вот статья по позиционным проверкам: habrahabr.ru/post/159483
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы