正则表达式在具有特定前缀的单词后匹配一个或多个数字或罗马数字,从I到X

问题描述 投票:1回答:1

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

示例将是:

"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);
}

我是否在正则表达式中缺少某些东西?任何朝着正确方向的指针将不胜感激。

php regex preg-match
1个回答
2
投票

您可以使用

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

请参见regex demo

**匹配任何1+数字或使用单词后的罗马数字,从1到10(IX

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

请参见this regex demo

[这里,一组替代项被添加到\d+VI{0,3}|I(?:[XV]|I{0,2})

详细信息

  • [\b-起始单词边界,没有字母,数字或_应该立即显示在当前位置的左侧
  • [ch-文字子字符串
  • \D*-0+个非数字字符
  • [\K-match reset operator
  • \d+-1个以上的数字
  • VI{0,3}|I(?:[XV]|I{0,2})-V和0、1、2或3Is(即罗马5、6、7、8)或I,后跟XV (即9和4)或0(因此,罗马1与之匹配),1或2个I(罗马2和3)。
© www.soinside.com 2019 - 2024. All rights reserved.