Регулярное выражение, соответствующее одной или нескольким цифрам или римскому числу от I до X после слова с определенным префиксом - PullRequest
1 голос
/ 07 октября 2019

Я хочу сопоставить число, помещенное в конце строки или, возможно, в середине.

Примером будет:

"chapter some word 12 or IV" or "chapter some word 12 or IV some word"

число, которое я хочу извлечь, это " 12 " или IV из строки.

Я пытался осмотреться с помощью ?:\w* или ?=\w*, но это не сработало.

Мое регулярное выражение:

if (preg_match('/ch\w*\s*\K(?|(?=((?<=|\s)\d+(?:\.\d+)?))|(?=([ivx]+(?![a-z]))))/i', $string, $matches)){
    print_r($matches);
}

Я что-то упустил с помощью регулярного выражения? Любые указатели в правильном направлении будут оценены.

1 Ответ

2 голосов
/ 07 октября 2019

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

'~\bch\D*\K\d+~i'

См. Демонстрационный пример regex

** Для сопоставления любых 1+ цифр или римских чисел от 1 до 10 (I до X) после слова использования

'~\bch.*?\K\b(?:\d+|VI{0,3}|I(?:[XV]|I{0,2}))\b~i'

См. это демонстрационное выражение regex

Здесь набор альтернатив добавлен к \d+: VI{0,3}|I(?:[XV]|I{0,2}).

Подробно

  • \b - начальная граница слова, без букв, цифр или _ должна отображаться немедленнослева от текущей позиции
  • ch - буквенная подстрока
  • \D* - 0+ нецифровых символов
  • \K - оператор сброса совпадения
  • \d+ - 1+ цифр
  • VI{0,3}|I(?:[XV]|I{0,2}) - V и 0, 1, 2 или 3 I с (т. Е. Римские 5, 6,7, 8) или I, за которым следуют X или V (то есть 9 и 4) или 0 (то есть, соответствует римский 1), 1 или 2 I с (римский 2и 3).
...