我需要匹配每一行,如果该行有“event4”,那么也必须有“event70”或“event71”,如果它没有“event4”,也匹配它。使用常规表达。
输入:
event4,event56,event70
event5, event72
No event number
event4,event56
预期匹配的行:
event4,event56,event70
event5, event72
No event number
正则表达式:
preg_match( "/(?:event4,(.*(event70|event71)+)|.*)/", $text, $matches, PREG_OFFSET_CAPTURE);
现在匹配所有行。
答案 0 :(得分:0)
使用(*SKIP)
的方式:
/^(?:event4\b(*SKIP).*event7[01])?.*$/m
我假设事件已排序(event4始终在event70之前)。
如果event4
并非总是在行的开头,则可以在模式的开头(锚点之后)添加.*?
。
工作原理:
(*SKIP)
强制正则表达式引擎在右侧的子模式(.*event7[01]
)失败时不重试左侧匹配的字符。结果,如果未找到event70或event71,则下一次尝试将在“event4”之后开始,(并且会因为^
锚点而到达换行时失败)
答案 1 :(得分:0)
试试这个:
preg_match_all('/(?(event4)(?(event7(0|1)).+)|.*)/', $text, $matches);