Сопоставьте шаблон, игнорируя разные скобки - 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).

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

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

И я не могу использовать отрицательный прогноз '/(?<!\()first(?!\))/', так как у меня есть три разных типа скобок, которые должны соответствовать открывающей и закрывающей скобкам.

1 Ответ

1 голос
/ 06 мая 2020

Вы можете сопоставить все 3 формата, которые вы не хотите, используя группу и чередование, и использовать (* SKIP) (* FAIL) , чтобы не получить эти совпадения. Затем сопоставьте first между границами слов \b

(?:\(first\)|\[first]|{first})(*SKIP)(*FAIL)|\bfirst\b

Regex demo

Пример кода

$strings = [
    "This is a (first) test with the first hit",
    "This is a (first] test with the first hit"
];

foreach ($strings as $str) {
    preg_match(
        '/(?:\(first\)|\[first]|{first})(*SKIP)(*FAIL)|\bfirst\b/',
        $str,
        $matches,
        PREG_OFFSET_CAPTURE);
    print_r($matches);
}

Выход

Array
(
    [0] => Array
        (
            [0] => first
            [1] => 32
        )

)
Array
(
    [0] => Array
        (
            [0] => first
            [1] => 11
        )

)

Php демонстрация

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