Как сопоставить! X, а не !! x в регулярном выражении JS? - PullRequest
2 голосов
/ 02 июня 2010

С учетом следующего текста:

This is!!xa simple string!xpattern

Я хотел бы получить регулярное выражение, совпадающее с !x между "строкой" и "шаблоном", но не !!xa между "is" и "a".

Это регулярное выражение должно использоваться внутри строки split().

Я пробовал несколько комбинаций, но я не могу получить регулярное выражение, отвечающее моим потребностям. Возможно, мое выражение лица не так регулярно =)

Заранее спасибо!


EDIT:

РЕШЕНИЕ

Просто чтобы прояснить, решение будет:

s.replace(/(([^!])|^)!x/g,'$1SOME_MAGICAL_STRING').split(/SOME_MAGICAL_STRING/)

Спасибо за идею решения jvenema и Amarghosh . А также всем, кто оставил отзыв.

Ответы [ 3 ]

0 голосов
/ 02 июня 2010
var s = "This is!!xa simple string!xpattern";
s.replace(/[^!]!x/,'-');

выход:

"This is!!xa simple strin-pattern"

Редактировать: Я пропустил г, мой плохой. Это работает:

var s = "!xThis is!!xa simple string!xpattern";
s.replace(/(([^!])|^)!x/g,'$1-');

выход: * +1010 *

"-This is!!xa simple string-pattern"

Все, что мы делаем, это сопоставляем предыдущий символ и затем возвращаем его в замену.

0 голосов
/ 02 июня 2010

Жаль, что у JS нет взгляда сзади :) Если нет !x!x, вы можете использовать RegExp.exec вместо String.split, как в

rx = /((?:[^!]|![^x])+)(?:!x|$)/g
res = []
while ((m = rx.exec("This is!!xa simple string!xpattern")))
  res.push(m[1]);

Здесь (?:[^!]|![^x])+ соответствует одному или нескольким не восклицательным знакам или ! , а не , за которыми следует x. Этот последний случай избавляет от !!. (?:!x|$) потребляет терминатор !x.


Редактировать: Поскольку !x!x может произойти, цикл должен быть немного изменен, чтобы избежать бесконечного цикла.

rx = /((?:[^!]|![^x])*)(?:!x|$)/g
res = []
str = "This is!!xa simpl!!xe!x!x string!xpattern"
while (true) {
  var m = rx.exec(str);
  if (m.index >= str.length)
    break;
  res.push(m[1]);
}
res
0 голосов
/ 02 июня 2010

Это выражение должно делать работу. Он использует отрицательный взгляд за утверждением, чтобы утверждать, что есть только один восклицательный знак.

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