首页 > 解决方案 > 正则表达式匹配一个或多个数字或从 I 到 X 的罗马数字在具有特定前缀的单词之后

问题描述

我想匹配放置在字符串末尾或中间的数字。

这个例子是:

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

我要提取的数字是字符串中的“ 12 ”或IV

我试图用?:\w*or环顾四周,?=\w* 但它不起作用。

我的正则表达式:

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

我错过了正则表达式的东西吗?任何正确方向的指针将不胜感激。

标签: phpregexpreg-match

解决方案


您可以使用

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

查看正则表达式演示

**匹配任何 1+ 数字或罗马数字从 1 到 10 ( Ito X)在单词 use 之后

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

看到这个正则表达式演示

在这里,一组备选方案被添加到\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 Is(即罗马 5、6、7、8),或者I后面跟着Xor V(即 9 和 4)或 0(所以,罗马 1 匹配), 1 或 2I秒(罗马书 2 和 3)。

推荐阅读