我的正则表达式中有两个条件(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 个比赛组?
由于两个正则表达式中与数字匹配的部分是相同的,因此您可以只在开始时进行交替,而不是围绕整个正则表达式:
preg_match('/((?:BIOLOGIQUES|Dossier N.'s+:)'s+('d+)'s+('d+)'s+'/'s+('d+))/u', $content, $match);
使用 u
修饰符正确匹配 UTF-8 字符。
我假设你的正则表达式是压缩的。如果点是用来缩写中间首字母的,则应对其进行转义。下面的建议就像巴马尔一样。如果不想捕获不同的名称,请从中删除括号。
抱歉,看起来您打算将其用作点元字符。只需从中删除 ''。
# (?:(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)
)