Соответствие регулярному выражению со следующим: пробел или конец строки - PullRequest
1 голос
/ 02 марта 2020

Мой regfu отклонен ... и у меня возникают проблемы с получением ожидаемых совпадений.

Вот пример того, что должно совпадать, а что нет:

  • NLNL LL
  • LNLN LL LL
  • NNLL LL LL LL
  • LNLN LLL LL
  • LLNN LL LLL <- пропустить, потому что: </li>

Требуется только:

  • от 1 до 3 Пары букв, разделенные одним пробелом
  • , которые являются последовательными до конца строки

\s{1}([A-Z]{2}) близко, но также захватывает часть пропуска выше.

Почему? Мне нужно получить инициалы имени из строк. К строкам добавляются инициалы 1,2 или 3 человека. Я возьму тех, у кого есть PHP, чтобы хранить их.

1 Ответ

1 голос
/ 02 марта 2020

Вы можете использовать

if (preg_match('~(?: [A-Z]{2})+$~', $s, $match)) {
    print_r(explode(" ", trim($match[0])));
}

Здесь (?: [A-Z]{2})+$ соответствует одной или нескольким последовательностям пробела, а затем двум заглавным буквам ASCII до конца строки, а затем explode(" ", trim($match[0])) разделяет усеченное совпадение с пробел.

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

if (preg_match_all('~(?:\G(?!\A)|(?=(?:\s[A-Z]{2})+$))\s\K[A-Z]{2}~', $s, $matches)) {
    print_r($matches[0]);
}

Здесь регулярное выражение соответствует:

  • (?:\G(?!\A)|(?=(?:\s[A-Z]{2})+$)) - конец предыдущего совпадения (\G(?!\A)) или (|) местоположение, за которым сразу следует одна или несколько последовательностей пробела, а затем две заглавные буквы ASCII до конца строки
  • \s - пробел
  • \K - оператор сброса соответствия
  • [A-Z]{2} - две заглавные буквы ASCII.

См. демонстрационную версию PHP 1030 *.

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