有人可以解释为什么这个正则表达式
/(?(DEFINE)
(?<alnum> [a-zäöüßÖÜÄ0-9-]+ )
(?<warranty_word> (?&alnum)?garantie[*]?)
)
(?&warranty_word)/six
只匹配 中的 Garantie Vor-Ort-Garantie ,但其他
https://regex101.com/r/oJKV1Q/1
/(?(DEFINE)
(?<warranty_word> ([a-zäöüßÖÜÄ0-9-]+)?garantie[*]?)
)
(?&warranty_word)/six
与 Vor-Ort-Garantie 完全匹配
https://regex101.com/r/axvJmA/1
以及如何在仍然对每个部分进行单独定义的同时完全匹配它
最佳答案
当你引用一个子模式时,这个子模式匹配的子串就变成了原子的。这就是为什么您的第一个图案只能获得“Garantie”的原因。对于“Vor-Ort-”中的每个位置,(?&alnum)
匹配所有字符直到“Garantie”结束,但是一旦进入 (?<warranty_word> ...)
的基础,正则表达式引擎就无法回溯,因为 (?&alnum)
是原子的。
注意:顺便说一句,当您必须处理 ascii 范围之外的字符时,您必须使用 u 修饰符,否则您的模式和目标字符串将被视为一系列单字节字符,而不是 utf8 编码字符串:
# ö is encoded with C3 B6
var_dump(preg_match('~[ö]~', "\xC3"));
# int(1)
var_dump(preg_match('~[ö]~u', "\xC3"));
# bool(false)
使用此修饰符,您可以从字符类中删除 Ä、Ö 和 Ü,因为您的模式不区分大小写。
关于regex - 正则表达式定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40237669/