我的正则表达式中有两个条件(在php上使用正则表达式)
(BIOLOGIQUES\s+(\d+)\s+(\d+)\s+\/\s+(\d+))|(Dossier N.\s+:\s+(\d+)\s+(\d+)\s+\/\s+(\d+))
当我用以下测试第一个条件时,我得到4个匹配组1 2 3和4
BIOLOGIQUES 47 131002 / 4302
请在此处查看第一个条件http://www.rubular.com/r/a6zQS8Wth6
但是当我用第二个条件测试时,组匹配是5 6 7和8
Dossier N° : 47 131002 / 4302
第二个条件:http://www.rubular.com/r/eYzBJq1rIW
是否有办法在第二个条件下始终拥有1 2 3和4个匹配组?
答案 0 :(得分:3)
由于两个与数字匹配的正则表达式的部分是相同的,因此您可以仅在开始时进行交替,而不是在整个正则表达式周围进行交替:
preg_match('/((?:BIOLOGIQUES|Dossier N.\s+:)\s+(\d+)\s+(\d+)\s+\/\s+(\d+))/u', $content, $match);
使用u
修饰符正确匹配UTF-8字符。
答案 1 :(得分:0)
我认为你的正则表达式是压缩的。如果点是缩写。中间的初始它应该被逃脱。下面的建议就像巴马尔那样。如果您不想捕获不同的名称,请从中删除括号。
抱歉,看起来你打算成为一个点metachar。只需从中移除\。
# (?:(BIOLOGIQUES)|(Dossier\ N\.\s+:))\s+((\d+)\s+(\d+)\s+\/\s+(\d+))
(?:
( BIOLOGIQUES ) # (1)
| ( Dossier\ N \. \s+ : ) # (2)
)
\s+
( # (3 start)
( \d+ ) # (4)
\s+
( \d+ ) # (5)
\s+ \/ \s+
( \d+ ) # (6)
) # (3 end)
编辑,应该考虑正则表达式,但如果它变得太不相同,重新使用相同捕获组的方法是使用Branch Reset
。
这是您的原始代码,其中包含一些使用分支重置的注释。
(?|(BIOLOGIQUES\s+(\d+)\s+(\d+)\s+\/\s+(\d+))|(Dossier\ N.\s+:\s+(\d+)\s+(\d+)\s+\/\s+(\d+)))
(?|
br 1 ( # (1 start)
BIOLOGIQUES \s+
2 ( \d+ ) # (2)
\s+
3 ( \d+ ) # (3)
\s+ \/ \s+
4 ( \d+ ) # (4)
1 ) # (1 end)
|
br 1 ( # (1 start)
Dossier\ N . \s+ : \s+
2 ( \d+ ) # (2)
\s+
3 ( \d+ ) # (3)
\s+ \/ \s+
4 ( \d+ ) # (4)
1 ) # (1 end)
)
或者,您可以考虑它并使用分支重置。
# (?|(BIOLOGIQUES\s+)|(Dossier\ N.\s+:\s+))(?:(\d+)\s+(\d+)\s+\/\s+(\d+))
(?|
br 1 ( BIOLOGIQUES \s+ ) # (1)
|
br 1 ( Dossier\ N . \s+ : \s+ ) # (1)
)
(?:
2 ( \d+ ) # (2)
\s+
3 ( \d+ ) # (3)
\s+ \/ \s+
4 ( \d+ ) # (4)
)