65

?, *andの代わりに明示的に番号付けされた繰り返しを使用する正規表現パターンを見てきました+

Explicit            Shorthand
(something){0,1}    (something)?
(something){1}      (something)
(something){0,}     (something)*
(something){1,}     (something)+

質問は次のとおりです。

  • これらの 2 つの形式は同一ですか? 所有格/消極的な修飾子を追加するとどうなりますか?
  • それらが同一である場合、どちらがより慣用的ですか? もっと読みやすい?単に「より良い」?
4

4 に答える 4

88

私の知る限り、それらは同一です。番号付き構文をサポートしていないエンジンがいくつかあると思いますが、どれかはわかりません。数日前のSOに関する質問で、Notepad++では明示的な表記が機能しなかったのをぼんやりと思い出します。

明示的に番号が付けられた繰り返しを使用するのは、繰り返しが1より大きい場合のみです。

  • 正確に2つ:{2}
  • 2つ以上:{2,}
  • 2〜4:{2,4}

特に繰り返しパターンが数文字以上の場合は、これらを好む傾向があります。3つの数字を一致させる必要がある場合、書くのが好きな人もいます。しかし、繰り返しの数が強調されるので\d\d\d、私はむしろ書きたいと思います。\d{3}さらに、将来、その数を変更する必要がある場合は、変更するだけ{3}{n}、頭の中の正規表現を再解析したり、混乱したりする必要はありません。精神的な努力が少なくて済みます。

その基準が満たされない場合、私は速記を好みます。「明示的」表記を使用すると、パターンがすぐに乱雑になり、読みにくくなります。私は、一部の開発者が正規表現をあまりよく知らないプロジェクトに取り組んできました(これは、必ずしもすべての人のお気に入りのトピックではありません{1}{0,1}。何人かの人々は私に彼らのパターンをコードレビューするように頼むでしょう、そしてそれは私がそれらの出現を速記法に変えてスペースを節約しそしてIMO、読みやすさを改善することを提案するときです。

于 2010-06-13T15:27:00.660 に答える
8

{n,m}境界のある反復を多く行う正規表現がある場合、読みやすさのためにフォームを一貫して使用したい場合があることがわかります。例えば:

/^
 abc{2,5}
 xyz{0,1}
 foo{3,12}
 bar{1,}
 $/x

しかし、私はそのようなケースを実際に見た記憶がありません。私が見るとき{0,1}{0,}または{1,}質問で使用されているとき、それは事実上常に無知から行われています. また、そのような質問に答える過程で、代わりに?,*またはを使用することも提案する必要があります。+

そしてもちろん、{1}純粋な混乱です。漠然と「唯一無二」の意味だと思っている人もいると思いますが、か意味があるのではないでしょうか?このように病的に簡潔な言語が、3 文字をすべて使用し、何もしない構文をサポートするのはなぜでしょうか? 私が知っている唯一の正当な使用法は、後ろにリテラルの数字が続く後方参照 (例: \1{1}0) を分離することですが、それを行う方法は他にもあります。

于 2010-06-13T22:16:15.483 に答える
2
  • 例外的な正規表現エンジンを使用していない限り、これらはすべて同じです。ただし、すべての正規表現エンジンが番号付きの繰り返し、?またはをサポートしているわけではありません+

  • それらがすべて利用できる場合は、数字ではなく文字を使用します。これは、私にとってより直感的だからです。

于 2010-06-13T15:29:11.173 に答える
1

それらは同等です(コンテキストをテストすることで、それらが利用可能かどうかを確認できます)。

私が予想する問題は、コードを操作する必要があるのはあなただけではない場合です。正規表現は、ほとんどの人にとって十分に難しいものです。誰かが通常とは異なる構文を使用するときはいつでも、次のような疑問が生じます。

于 2010-06-13T16:10:55.647 に答える