соответствует слову, которое содержит "XYZ" и не начинается с двоеточия - PullRequest
2 голосов
/ 25 января 2020

Я ищу шаблон регулярного выражения, который соответствует любому слову, которое содержит XYZ и не начинается с двоеточия :.

Например, я хочу сопоставить только с This isXYZ a :exampleXYZa isXYZ.

Моя первая идея состояла в том, чтобы использовать этот шаблон регулярных выражений:

/(?<!\:[^\s\r\t\n])XYZ/

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

РЕДАКТИРОВАТЬ: Я также хотел бы иметь поддержку utf8.

1 Ответ

2 голосов
/ 25 января 2020

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

/\b((?<!:)\w*XYZ\w*)\b/ui
  • \b до и после, чтобы просто соответствовать границе слова.

  • В ((?<!:)\w*XYZ\w*) мы проверяем любое слово, которое содержит XYZ и содержит ноль или более символов перед ним и ноль или более символов после него. С помощью негативного взгляда за (?<!:) мы убедимся, что ему не предшествует :.

  • Как указано @ unclexo в комментариях , вы можете добавить модификатор u в конце для поддержки соответствия последовательности UTF-8. Подробнее см. Здесь .

  • Вы также можете добавить флаг i для нечувствительного к регистру соответствия.

Фрагмент:

<?php

$tests = [
        'This isXYZ a :exampleXYZa',
        'isXYZ a :exampleXYZa abcXYZ',
        'isXYZ a :exampleXYZXYZa  abcXYZ',
        'XYZ',
        'XYZjdhf',
        'This isXYZ a example:XYZa',
        'äöüéèXYZ :äöüéèXYZäöüéè'
    ];

foreach($tests as $test){
    if(preg_match_all('/\b((?<!:)\w*XYZ\w*)\b/ui',$test,$matches)){
        print_r($matches[0]);
    }
}

Демонстрация: https://3v4l.org/Y8SMj

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