2014-08-28 60 views
2

我需要匹配每行,如果行有“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

'用逗号分解()',然后'in_array()' – 2014-08-28 20:33:53

+0

你需要在'。*'选项中使用负面查找。 – Barmar 2014-08-28 20:39:00

回答

0

使用(*SKIP)道:

/^(?:event4\b(*SKIP).*event7[01])?.*$/m 

online demo

我认为事件排序(EVENT4总是event70之前)。 如果并不总是在行的开头,那么可以在模式的开始处(在锚点之后)添加.*?

它是如何工作:

(*SKIP)迫使正则表达式引擎不会重试左侧匹配时,右边的子模式(.*event7[01])失败的字符。因此,如果event70或event71没有找到下一个尝试会后开始“EVENT4,” (直到是因为^锚达成的新行会失败)

+0

这与事件4单独是不正确的 – 2014-08-28 21:17:29

+0

@AdanZweig:删除逗号或用'\ b'替换它 – 2014-08-28 22:22:50

0

试试这个:

preg_match_all('/(?(event4)(?(event7(0|1)).+)|.*)/', $text, $matches);