Регулярные выражения для совпадения чисел (как регулярные, так и римские) - PullRequest
3 голосов
/ 01 апреля 2020

Я пытаюсь написать регулярное выражение, чтобы соответствовать как обычные числа (1, 2, 42 ...) и римские (X, VII ...).

Но один В настоящее время я написал :

\b((?=[MDCLXVI])M{0,3}(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3}))\b|\b\d+\b

соответствует больше, чем ожидалось. В нем 9 матчей, а я ожидаю только 4:

  • XII
  • VII
  • 2
  • 12

Как я могу это исправить?

Ответы [ 2 ]

3 голосов
/ 01 апреля 2020

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

Ваше регулярное выражение можно упростить и изменить его следующим образом:

/
\b
   (?:
      [MDCLXVI]M{0,3}C[MD]
      |
      D?C{0,3}X[CL]
      |
      L?X{0,3}I[XV]
      |
      [XV]I{0,3}
      |
      I{1.3}
      |
      \d+
   )
\b
/gix

Обновленная демонстрация RegEx

Обратите внимание, что я использовал x (расширенный режим) в регулярном выражении, чтобы регулярное выражение игнорировало все пробелы, что позволяет вам иметь правильный отступ между несколькими чередованиями, чтобы сделать ваше регулярное выражение более читабельным. Я не знаю всех перестановок римского числа, поэтому я предлагаю вам перепроверить каждое чередование.

2 голосов
/ 01 апреля 2020

Причиной этого является возможность совпадения нулевой ширины только с шаблонами границ слов (т. Е. \b(?=[MDCLXVI])\b совпадений перед любым словом, начинающимся с буквы латинского числа).

Вы необходимо уточнить границы слов, сопоставить первый из них только перед словом char, а последний - только после слова char:

(?<!\w)(?:(?=[MDCLXVI])M{0,3}(?:C[MD]|D?C{0,3})(?:X[CL]|L?X{0,3})(?:I[XV]|V?I{0,3})|\d+)(?!\w)

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

Здесь (?<!\w) действует как граница слова, которая не соответствует, если непосредственно в слева от текущего местоположения есть слово char, а (?!\w) действует как слово граница, которая не соответствует совпадению, если непосредственно к справа от текущего местоположения есть слово char.

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