[abc]和(a | b | c)之间的差异

use*_*531 3 regex pcre

对于PCRE正则表达式,[abc]和(a | b | c)之间有什么区别?

Gre*_*con 10

您问题中的模式与同一文本匹配.在实现方面,它们对应于不同的自动机和副作用(,它们是否捕获子串).

在下面的评论中,加勒特·奥尔布赖特指出了一个微妙的区别.而(.|\n)任何字符匹配,[.\n]匹配无论是字面点或换行.虽然点不再是一个字符类中的特殊,其他字符,如-,^]与序列一起如[:lower:]采取字符类中的特殊含义.需要注意将特定语义从一个上下文保留到另一个上下文,但有时候这种情况是不可能的,例如在字符类之外\1作为一种古老的写作方式$1.在字符类中,\1始终匹配字符SOH.

字符类([...])针对匹配某些字符集中的一个进行了优化,而alternative(x|y)允许更多长度的更一般选择.如果您牢记这些设计原则,您将倾向于看到更好的性能.正则表达式实现将源代码转换/[abc]/为有限状态自动机,通常是NFA.我们认为正则表达式引擎是或多或少的帮助执行这些目标状态机的簿记员.足够聪明的正则表达式编译器将为等效的正则表达式生成相同的机器代码,但由于潜在的指数复杂性,这在一般情况下是困难且昂贵的.

有关正则表达式背后的理论的可访问介绍,请阅读马克· 多米努斯的"如何使用正则表达式".如需深入研究,请考虑Peter Linz 撰写的" 形式语言和自动机简介".