对于PCRE正则表达式,[abc]和(a | b | c)有什么区别?[abc]和(a | b | c)之间的区别
回答
问题中的模式匹配相同的文本。在实施方面,它们对应于不同的自动机和副作用(,即,它们是否捕获子串)。
在下面的评论中,Garrett Albright指出了一个微妙的区别。鉴于(.|\n)
匹配任何字符,[.\n]
匹配文字点或换行符。尽管点在字符类中不再特殊,但其他字符(如-
,^
和]
)以及诸如[:lower:]
等序列在字符类中具有特殊含义。需要注意将特殊语义从一种上下文保留到另一种上下文中,但有时它可能是不可能的,例如\1
作为在字符类外部编写$1
的古代方式。在角色类中,\1
总是与角色SOH匹配。
字符类([...]
)针对某些字符集中的某一个进行了优化,而替代方案(x|y
)允许更改一般长度的选项。如果你牢记这些设计原则,你会看到更好的表现。正则表达式实现将源代码(如/[abc]/
)转换为有限状态自动机,通常为NFAs。我们认为正则表达式引擎是帮助执行这些目标状态机的或多或少的簿记员。足够智能的正则表达式编译器将为等效的正则表达式生成相同的机器码,但由于lurking exponential complexity的原因,这在一般情况下很难并且很昂贵。
有关正则表达式理论的可访问性介绍,请参阅Mark Dominus的“How Regexes Work”。为了更深入的研究,请考虑Peter Linz的An Introduction to Formal Languages and Automata。
你什么时候使用一个? “他们对应不同的自动机和子串捕获”是什么意思?谢谢 – user1032531
如果a,b和c只是字母,当然(就像我认为的意思)。如果他们能够代表文字,显然它是完全不同的语义。 – kratenko
我发现有时方括号选项似乎不适合有趣的字符,如'\ n'或'\ r'。例如,要捕捉包含换行符的FOO和BAR之间的所有文本,'/ FOO((。| \ n)+)BAR /'有效,而'/ FOO([。\ n] +)BAR /'没有。不过,这可能是特定于实现的。我发现了其他的差异,就像我无法回想起我的头顶。无论如何,一般来说,我会先尝试使用'[ab]',因为它更具可读性,如果事情似乎没有奏效,那就试试'(a | b)'。 –
(阅读格雷格的回答后):如果他们有不同的评价应该依赖于你给他们的任何程序。选择你想要检查的内容。你想检查一堆有效的字符,或者你想检查值。 - 有时看起来可能是一样的,但它背后可能有不同的意图。然后选择反映你意图的东西。
PCRE使用方括号的表格要快得多,特别是在启用了JIT编译的情况下。它只是在比特中检查一下,而另一个重新读取每个选择的字符。我正在考虑一种可以检测这种情况的优化,因为很多人不知道可以在方括号内使用字符类,并且它们使用([a-z] | \ s)+而不是[a-z \ s] +。
- 1. `从abc import a,b`和`from abc import(a,b)`有没有区别?
- 2. a + b和.__之间的区别__(b)
- 3. [:] = b和a = b [:]之间的区别? (Python)
- 4. a + = b和a = + b之间的区别是什么,a ++和++ a?
- 5. a = a ||之间的区别b和a || = B
- 6. a = a + b和a + = b之间的区别是什么?
- 7. ||之间的区别a = b和a = a || b在红宝石?
- 8. bash中的$ [a-b]和$((a-b))之间的区别
- 9. Kleene明星在编程。 (a | b)*和a * b *之间的区别?
- 10. * a = b和a =&b之间的区别是什么?
- 11. Scala中f(a,b)和f(a)(b)之间的区别
- 12. a [:] = b和a = b之间的区别是什么?
- 13. a // b和int(a/b)之间有什么区别?
- 14. 在PHP OOP中$ a =&$ b,$ a = $ b和$ a = clone $ b之间的区别OOP
- 15. 未定义的引用 - 应该在C++中的`a = -b;`和`a = -1 * b;`和`a = 0-b'之间有区别吗?
- 16. '(a b c)和(list'a'b'c)之间的区别是什么?
- 17. C++两个向量之间的区别<MyType*> A和B
- 18. double a = a + int b和int a + = double b之间的区别是什么?
- 19. '(int)a','a as int'和C#中的Convert.ToInt32(a)之间的区别
- 20. 区别 “A级; B类” 和 “类A :: B”
- 21. tmux中的'C-b d'和'C-b D'之间的区别
- 22. val b = a(a是一个Array)和val b = a.clone()之间的区别是什么?
- 23. MySQL:`... ADD INDEX(a);之间的区别... ADD INDEX(b);`和`... ADD INDEX(a,b);`?
- 24. * a = b和a =&b之间的差异?
- 25. 两个数组之间的区别? A - B = C
- 26. String [] a和String之间的区别... a
- 27. d.update(dict(a = 1,b = 2))和d.update(dict('a'= 1,'b'= 2)之间有什么区别)
- 28. (a不在b)与(不在b中)之间的区别。 Python
- 29. 复制/ a和复制之间的区别/ b
- 30. Java中a + = b和a = a + b的区别
相关[使用交替或字符类的单个字符匹配?](http://stackoverflow.com/questions/4724588/using-alternation-or-character-class-for-single-character-matching)有一些有趣的答案。 – stema
那个帖子很有帮助。谢谢 – user1032531