正则表达式:多个选项之间的OR运算符

时间:2017-11-09 22:09:24

标签: php regex

https://regex101.com/r/VY5LIG/1

图案

(?:faktura|kreditnota|kvittering)\b ?((?:\p{L}+\d+|(?:[\d ]|[^\p{L}])*))

受试者

faktura/kvittering 6856895

为什么这个正则表达式在这种情况下不匹配kvittering

该组需要匹配数字

1 个答案:

答案 0 :(得分:2)

您获得的匹配是由于(?:faktura|kreditnota|kvittering)与第一个faktura匹配,然后[^\p{L}]与该词后面的斜杠匹配。

如果您抓取所有匹配项,则可以获取最后一项匹配项,然后访问[组1值]。1

获得最后一场比赛的另一种方法是在模式的开头添加.*并添加s修饰符,以确保.匹配任何包含换行符的字符,然后您能够获得preg_match的匹配并再次获取第1组值。请参阅this regex demo

然而,根据描述,您似乎需要匹配第一个交替组中的单词,然后匹配一个或多个代码,这些代码似乎由字母数字/单词字符组成。因此,我建议使用:

'~\b(?:faktura|kreditnota|kvittering)\s+\K\w+~'

请参阅this regex demo

模式详情

  • \b - 领先的单词边界
  • (?:faktura|kreditnota|kvittering) - 三个单词中的任何一个
  • \s+ - 一个或多个空格
  • \K - 匹配重置运算符,省略了匹配内存缓冲区的文本
  • \w+ - 1个单词字符(您可以使用[^\W_]来匹配字母数字字符)。