有人可以解释为什么这个正则表达式

/(?(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/

10-12 20:50