-1

次の正規表現の違いは何ですか。私にとってはどちらも同じです

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

6 に答える 6

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つはただ1 + [0, \infinity] = [1, \infinity]、もう1つは[1, \infinity]です。

その他のコメント

#2も同様に機能します。それぞれの場合で行っているのは、繰り返される文字の1つの例をとっているだけです(あなたの場合、[a-zA-Z]繰り返し文字コマンドから、*または+.

以下の回答は、より読みやすいバージョンが優先されることを示しています。[a-zA-Z]*[a-zA-Z]または[a-zA-Z][a-zA-Z]*のようなことをする理由はまったくありません[a-zA-Z]+

TL;DR

すべて同じであり、正規表現で 2 つの同一のコマンドを続けて繰り返しているときはいつでも、何か間違ったことをしています。

アップデート:

$ 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 マイクロ秒の向上に値するとは思いません。

于 2012-12-25T23:02:46.350 に答える
1

機能的には、これらの正規表現はすべて同一です。

ただし、数量詞の使用は+、パーサーとその設定に応じて、\+その特別な意味を保持するためにエスケープ()する必要がある場合とない場合があるため、問題になる場合があります。そのため、正規表現の移植性を維持するために、使用を避け+、より明示的な形式を好む人もいます。XX*

ただし、Javaに関する限り、+エスケープされない限り、常にその特別な意味を保持します。

于 2012-12-25T23:10:39.477 に答える
0
[a-zA-Z][a-zA-Z]* Vs [a-zA-Z]*[a-zA-Z]

この正規表現の主な違いは、最初の表現が2番目の表現よりも早く行われることだと思います。[a-zA-Z] [a-zA-Z] *の一致のためのツリーウォークは、式の別の部分よりも少ないステップで構成されているためです。

于 2012-12-25T23:14:09.740 に答える
0

はい、4 つすべてが完全に等しい正規表現です。[a-z]+は最も単純なものであり、読みやすさの問題から選択する必要があります。

于 2012-12-25T23:02:04.180 に答える
0

その通りで[a-zA-Z][a-zA-Z]*[a-zA-Z]+すべて同じ文字列に一致するため、その点では違いはありません。他の利点よりも優れている主な利点[a-zA-Z]+が 1 つあります。

于 2012-12-25T23:02:39.070 に答える
0

両方とも同じチェックアウトのPattern Reluctant 量指定子です。[a-zA-Z]+ は、自分や他の人にとってより読みやすくなっています。

于 2012-12-25T23:06:09.067 に答える