[az] [az]*和[az] +正则表达式之间的差异

Abr*_*chi 1 java regex

以下正则表达式之间有什么区别.对我来说,他们都是一样的

  1. [a-z][a-z]* VS [a-z]+
  2. [a-z][a-z]* VS [a-z]*[a-z]

jdo*_*dot 6

正如你所想,这些正则表达式完全相同.

#1:

[a-zA-Z]  # exactly one alphabetic char
[a-zA-Z]* # 0 to infinite alphabetic chars
Run Code Online (Sandbox Code Playgroud)

[a-zA-Z]+ # 1 to infinite alphabetic chars
Run Code Online (Sandbox Code Playgroud)

一个只是1 + [0, \infinity] = [1, \infinity],另一个[1, \infinity].

进一步评论

#2的工作方式类似,在每种情况下你所做的只是重复字符的一个例子(在你的情况下,[a-zA-Z]重复的字符命令,*+.

下面的答案指出,首选的可读性较高的版本是正确的目标.绝对没有任何理由这样做[a-zA-Z]*[a-zA-Z][a-zA-Z][a-zA-Z]*,因为ultimatley他们都只是[a-zA-Z]+.

TL; DR

一切都是一样的,只要你在正则表达式中连续重复两个相同的命令,你就会做错事.

更新:

$ 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
Run Code Online (Sandbox Code Playgroud)

事实证明,这[a-zA-Z][a-zA-Z]*比使用速度略快[a-zA-Z]+.我有点惊讶,但坦率地说,我认为可读性的损失不值得.05微秒的效率提升.