RegExp: сопоставить только одно вхождение подстроки - PullRequest
1 голос
/ 10 марта 2011

Здравствуйте, мне нужно заменить только одно вхождение подстроки Пример:

Несколько предложений # x; #x; # x ; с # x; #x; некоторыми # x; словами # x; необходимо заменить.

Нужно заменить только один # x; на # y; и получить следующую строку

Некоторые предложения # x; #x; #x; с # x; #x; some # y; words # y; нужна замена.

Некоторые примечания: моя строка будет содержать символы Юникода, и оператор \ b не работает.

Ответы [ 4 ]

2 голосов
/ 10 марта 2011

Вы можете соответствовать #x; повторяется любое количество раз и заменяет только те, которые встречаются один раз:

sentence = sentence.replace(/((?:#x;)+)/g, function(m) {
  return m.length == 3 ? '#y;' : m;
});
2 голосов
/ 10 марта 2011

Простейшим регулярным выражением, совпадающим только с единичными вхождениями #x;, будет использование утверждения lookehind и lookahead.

/(?<!#x;)#x;(?!#x;)/

Однако Javascript не поддерживает lookbehinds, поэтому вы можете попробовать этот обходной путь, используя тольковместо того, чтобы смотреть вперед:

/(^[\S\s]{0,2}|(?!#x;)[\S\s]{3})#x;(?!#x;)/

Полный пример:

> s = 'Some sentence #x;#x;#x; with #x;#x; some #x; words #x; need in replacing.'
> s = s.replace(/(^[\S\s]{0,2}|(?!#x;)[\S\s]{3})#x;(?!#x;)/g, '$1#y;')
"Some sentence #x;#x;#x; with #x;#x; some #y; words #y; need in replacing."
1 голос
/ 10 марта 2011

Одиночный #x; может быть квалифицирован как наличие пробела до и после.В этом случае вы можете использовать это:

str.replace( /(\s+)#x;(\s+)/g, '$1#y;$2' )
0 голосов
/ 10 марта 2011

использование str.replace('/(#x;)+/g','#y;')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...