[a-z] [a-z] *和[a-z] +正则表达式之间的差异

时间:2012-12-25 22:57:34

标签: java regex

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

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

6 个答案:

答案 0 :(得分:6)

正如您所想,这些正则表达式完全相同。

#1:

[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]或{{中的重复字符(在您的情况下为*)中的一个示例1}}。

下面的答案指出,首选的可读性较高的版本是正确的。绝对没有理由做+[a-zA-Z]*[a-zA-Z]之类的事情,因为最终他们只是[a-zA-Z][a-zA-Z]*

TL; DR

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

更新

[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]*略快。我有点惊讶,但坦率地说,我认为可读性的损失不值得.05微秒的效率提升。

答案 1 :(得分:1)

功能上所有这些正则表达式都是相同的。

但是,在某些情况下,使用+量词可能会有问题,因为根据解析器及其设置,它可能或者可能不需要转义(\+)以保留它的特殊含义。这就是为什么有些人会避免使用+而更喜欢更明确的XX*形式,以保持其正则表达式更具可移植性。

就Java而言,+ always retains its special meaning, unless escaped

答案 2 :(得分:0)

是的,这四个都是完全相同的正则表达式。 [a-z]+是最简单的一个,应该选择它来解决可读性问题。

答案 3 :(得分:0)

你是对的,[a-zA-Z][a-zA-Z]*[a-zA-Z]+匹配所有相同的字符串,所以在这方面没有区别。 [a-zA-Z]+有一个主要优点,即它更具可读性(可读性很重要!)。

答案 4 :(得分:0)

两者都是相同的结帐Pattern不情愿的量词。 [a-zA-Z] +对你自己和他人来说更具可读性。

答案 5 :(得分:0)

[a-zA-Z][a-zA-Z]* Vs [a-zA-Z]*[a-zA-Z]

我认为这个正则表达式之间的主要区别在于第一个表达式将比第二个表达式早完成。因为[a-zA-Z] [a-zA-Z] *的匹配树步行包含的步骤少于表达式的另一部分。