簡體   English   中英

[az] [az] *和[az] +正則表達式之間的差異

[英]Difference betwen the [a-z][a-z]* and [a-z]+ regular expressions

以下正則表達式之間有什么區別? 對我來說他們都是一樣的

  1. [az][az]* [az]+
  2. [az][az]* [az]*[az]

正如您所想,這些正則表達式是相同的。

#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]

下面的答案指出,更易讀的版本是首選。 絕對沒有理由做[a-zA-Z]*[a-zA-Z][a-zA-Z][a-zA-Z]*事情,因為最后一招它們都只是[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

結果表明[a-zA-Z][a-zA-Z]*比使用[a-zA-Z]+要快。 我有些驚訝,但是坦率地說,我不認為可讀性的降低值得.05微秒的效率提高。

從功能上來說,所有這些正則表達式都是相同的。

但是,在某些情況下,使用+量詞可能會出現問題,因為取決於解析器及其設置,為了保留其特殊含義,它可能需要轉義( \\+ ),也可能不需要轉義( \\+ )。 這就是為什么有些人避免使用+並更喜歡使用更明確的XX*形式,以便使其正則表達式更具可移植性。

但是,就Java而言, +始終保留其特殊含義,除非轉義

是的,這四個都是完全相等的正則表達式。 [az]+是最簡單的一種,應針對可讀性問題進行選擇。

沒錯, [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] *的樹形匹配步數少於表達式的另一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM