Сопоставьте шаблон, игнорируя скобки - PullRequest
0 голосов
/ 06 мая 2020

У меня есть строка, и я хотел бы узнать первую позицию шаблона. Но его следует искать, только если он не заключен в квадратные скобки.

Пример строки: "This is a (first) test with the first hit"

Я хочу знать положение второго first => 32 . Чтобы соответствовать ему, (first) необходимо игнорировать, потому что он заключен в скобки.

Я пробовал это:

preg_match(
  '/^(.*?)(first)/',
  "This is a (first) test with the first hit",
  $matches
);
$result = strlen( $matches[2] );

Он работает нормально, но результатом является положение первое совпадение (11).

Итак, мне нужно изменить .*?.

Я попытался заменить его на .(?:\(.*?\))*? в надежде, что все символы внутри скобок будут проигнорированы.

А это совсем не совпадает.

Ответы [ 4 ]

2 голосов
/ 06 мая 2020
/(?<!\()first(?!\))/

Можно использовать негативный взгляд вперед ?! и отрицательно смотреть за оператором?

preg_match(
  '/(?<!\()first(?!\))/',
  "This is a (first) test with the first hit",
  $matches
);

соответствует только тексту, не заключенному в квадратные скобки, или вы можете просто проверить начало слова, если не нужно слово, начинающееся со скобки

/(?<!\()first/
0 голосов
/ 06 мая 2020

Это может сработать.

/(?<!\()\bfirst\b(?!\))/g

(первый) игнорируются, но будут сопоставлены {first} или [first] (только первое слово). xxfirstxx также игнорируется из-за границы слова \ b

Другой образец

0 голосов
/ 06 мая 2020

Попробуйте \(first\)(*SKIP)(*FAIL)|first

демо

0 голосов
/ 06 мая 2020

Вы можете использовать регулярное выражение

(?!\(first\)).\K\bfirst\b

Demo

Механизм регулярных выражений выполняет следующие операции.

(?!          # begin a negative lookahead
  \(first\)  # match '(first)'
)            # end negative lookahead
.            # match any character
\K           # forget all matched so far (the previous character)
\bfirst\b    # match 'first' surrounded by word breaks

Если строка не содержит подстроки (first) каждая подстрока first (окружена разрывом слова) соответствует. В зависимости от требований может быть интересным только первое совпадение.

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