2014-02-04 4 views
0

Мне нужно совместить неправильные обратные косые черты в тексте. Следующий текст является примером:Perl/Javascript Регулярное выражение с оператором 'и'

\.br\ Random Words \.br\\1 Testing\.br\2\ Check 

Так что \ .br \ правильны, однако слеш \ 1 и 2 \ нет.

Так что я попытался регулярное выражение, чтобы соответствовать любой \, не сопровождаемый .br, но это не удалось, потому что он будет соответствовать закрывающий \ в \ .br \

Я посмотрел вверх несколько подобных вопросов на StackOverflow, и большинство из них заявили, что серия lookaheads может быть использован в качестве «и» оператора и поэтому я попытался это:

/(?!\\\.br)\\(?!\.br\\)/ 

То, что я пытался сделать, был соответствовать любой обратной косой ТНА t не было ни предваряем \ .br, ни сопровождалось .br \, но оно, похоже, не работало.

Любая помощь будет оценена по достоинству. Надеюсь, я не пропустил никаких подробностей в этом вопросе.

Спасибо,

Sid

+0

Вы используете механизм регулярных выражений perl или javascript? Вы можете использовать отрицательное утверждение lookbehind для достижения этого, если используете жемчуг. Регулятор Javascript Hovever не поддерживает отрицательный lookbehind. – MElliott

+0

Я действительно должен был сделать это на обоих двигателях. Одним из моих кодов был скрипт perl, а другой - javascript. Я считаю, что обходное решение ikegami может решить проблему.Но не знает, как это будет работать, если есть другие действующие ускользает в смеси, как \ F \ \ S \ \ T \ – Sid

ответ

6

Закрыть. (?!PAT) означает «не следует PAT». Вы хотите «не предшествовать PAT».

(?<!\\\.br)\\(?!\.br\\) 

Ниже будет немного быстрее:

\\(?<!\\\.br\\)(?!\.br\\) 
+0

Предполагая, что OP использует PERL регулярного выражения, это будет работать замечательно, однако это не будет работать с яваскриптом регулярных выражений. – MElliott

+0

Это должно быть отмечено как ответ. Протестировано по адресу http://regexhero.net/tester/ – celerno

+0

@MElliott. Есть много способов обойти это. Именно то, что зависит от большей картины. Например, удаление «плохих» обратных косых черт: 's/\\ (\. Br \\)?/$ 1? "\\. br \\": ""/eg' – ikegami

0
(?:\\(?!\.br)\\)+(\S+) 

Регулярное выражение выше будет захватывать эти символы внутри обратной косой черты, которые не .br.

* Обратите внимание, что номер 2 в \.br\2\ не будет запечатлен как .br \ правильно напечатан.

2

Я хотел бы использовать Perl, и с \G якорем и \K мета характер (и некоторых атомных/притяжательные части для повышения эффективности):

\G(?>\\\.br\\|[^\\]++)*+\K\\ 

Это должно быть быстрее, чем использование поисковых запросов, так как нет дублирования совпадений (переключение одной и той же подстроки более одного раза, что и есть karounds do).

regex101 demo.

Соответствие завершено 24 и 21 шагом соответственно (в отличие от использования поворотного стола с использованием 36 и 22 шагов, а также 4 шага неудачи).

+0

Это не просто соответствует запросу '\'. Это означает, что он не может быть вставлен в более крупный шаблон, но это может быть приемлемым. Я определенно использую '\ K', когда это возможно. – ikegami

+0

Бит эффективности - это то, что я не принимаю во внимание, поэтому спасибо за указание на это. Я всегда использовал regex101 и не понимал, что он показал шаги, которые потребуются. Спасибо за помощь, я бы тоже хотел это сделать, но моя репутация не позволит мне. – Sid

+0

@ Сид. Все в порядке :) – Jerry

Смежные вопросы