Побег двойной обратной косой черты

Мне нужно сопоставить все строки, как /(\:\w+)/ (например. :hello), за исключением случаев, когда перед первым символом экранируется обратная косая черта, например: \:hello, Так что, в этом случае, не будет совпадать. Но, если я дважды избежу этого, я могу игнорировать обратную косую черту предложения и будет работать нормально, например: \\:hello получит :hello только. И так далее.

Примеры:

  • test :hello test будет соответствовать :hello
  • test \:hello test не будет соответствовать
  • test \\:hello test будет соответствовать :hello
  • test \\\:hello test не будет соответствовать
  • test \\\\:hello test будет соответствовать :hello
  • test \\\\\:hello test не будет соответствовать
  • test \\\\\\:hello test будет соответствовать :hello

1

Решение

Вы можете попробовать следующее регулярное выражение, которое использует \K (отбрасывает ранее подобранные символы).

(?:\s|^)(?:\\\\)*\K:\w+

DEMO

3

Другие решения

Ну вот:

$regex = '/(?<=^|[^\\\\])(?:[\\\\]{2})*(?P<tag>:\w+)/';

И некоторые тесты:

$tests = array(
'test :hello test',
'test \\:hello test',
'test \\\\:hello test',
'test \\\\\\:hello test',
'test \\\\\\\\:hello test',
'test \\\\\\\\\\:hello test',
'test \\\\\\\\\\\\:hello test',
);
echo '<pre>';
foreach ($tests as $test) {
preg_match($regex, $test, $match);
if (empty($match)) {
echo 'NOPE:  ', $test, "\n";
} else {
echo 'MATCH: ', $test, ' - ', $match['tag'], "\n";
}
}

Это дает мне:

MATCH: test :hello test - :hello
NOPE:  test \:hello test
MATCH: test \\:hello test - :hello
NOPE:  test \\\:hello test
MATCH: test \\\\:hello test - :hello
NOPE:  test \\\\\:hello test
MATCH: test \\\\\\:hello test - :hello
1

Ты пробовал как этот: —

(?!<=)(:hello)
0

Как насчет

если происходит в начале строки

^(?:\\\\)*(:hello)

где-нибудь еще

\s(?:\\\\)*(:hello)\b

обратная ссылка \1 будет содержать :hello

посмотрите пример

http://regex101.com/r/hF1mW6/1

0
По вопросам рекламы [email protected]