以下正则表达式有什么区别。对我来说,它们都是一样的
[a-z][a-z]*
VS[a-z]+
[a-z][a-z]*
VS[a-z]*[a-z]
正如您所想的,这些正则表达式是相同的。
[a-zA-Z] # exactly one alphabetic char
[a-zA-Z]* # 0 to infinite alphabetic chars
相对
[a-zA-Z]+ # 1 to infinite alphabetic chars
一个是刚刚1 + [0, \infinity] = [1, \infinity]
,另一个[1, \infinity]
。
#2 的工作原理类似,您在每种情况下所做的只是以重复字符的一个示例(在您的情况下,[a-zA-Z]
, 来自重复字符命令,*
或+
.
下面的答案指出,更易读的版本是首选是正确的目标。绝对没有理由做类似[a-zA-Z]*[a-zA-Z]
or的事情[a-zA-Z][a-zA-Z]*
,因为最终它们都是[a-zA-Z]+
.
一切都是一样的,只要你在正则表达式中连续重复两个相同的命令,你就做错了。
$ python -m timeit -s "import re" "re.search(r'[a-zA-Z]*[a-
zA-Z]', '2323hfjfkf 23023493')"
1000000 loops, best of 3: 1.14 usec per loop
$ python -m timeit -s "import re" "re.search(r'[a-zA-Z]+',
'2323hfjfkf 23023493')"
1000000 loops, best of 3: 1 usec per loop
$ python -m timeit -s "import re" "re.search(r'[a-zA-Z][a-z
A-Z]*', '2323hfjfkf 23023493')"
1000000 loops, best of 3: 0.956 usec per loop
事实证明,这[a-zA-Z][a-zA-Z]*
比使用[a-zA-Z]+
. 我有点惊讶,但坦率地说,我不认为可读性的损失值得 0.05 微秒的效率提升。
在功能上,所有这些正则表达式都是相同的。
但是,在某些情况下使用+
量词可能会有问题,因为根据解析器及其设置,它可能需要或不需要转义 ( \+
) 以保留其特殊含义。这就是为什么有些人避免使用+
并更喜欢更明确的XX*
形式,以保持他们的正则表达式更便携。
但是,就 Java 而言,它+
始终保留其特殊含义,除非 escaped。
是的,所有四个都是完全相等的正则表达式。[a-z]+
是最简单的一种,应该为可读性问题选择。
你是对的[a-zA-Z][a-zA-Z]*
并且[a-zA-Z]+
匹配所有相同的字符串,所以在这方面没有区别。与另一个相比,它有一个主要优势[a-zA-Z]+
,那就是它更具可读性(可读性很重要!)。
两者都是相同的检查模式不情愿量词。[a-zA-Z]+ 对自己和他人来说更具可读性。
[a-zA-Z][a-zA-Z]* Vs [a-zA-Z]*[a-zA-Z]
我认为这个正则表达式的主要区别在于第一个表达式比第二个表达式更早完成。因为 [a-zA-Z][a-zA-Z]* 的匹配树的步数少于表达式的另一部分。