web-dev-qa-db-ja.com

疑問符、スター、プラスの代わりに明示的に番号付けされた繰り返しを使用する

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

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

質問は次のとおりです。

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

私の知る限り、それらは同一です。番号付けされた構文をサポートしていないエンジンがいくつかあると思いますが、どのエンジンかはわかりません。私はSOのメモパッド++で明示的な表記法が機能しなかった数日前の質問を漠然と思い出します。

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

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

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

その基準が満たされない場合、私は速記を好む。 「明示的な」表記法を使用すると、パターンがすぐに乱雑になり、読みにくくなります。私は、一部の開発者が正規表現をあまりよく知らないプロジェクトに取り組んできました(正確には誰もが好むトピックではありません)。{1}{0,1}の出現を多く見ました。少数の人々は、パターンのコードレビューを依頼されますが、その場合は、それらの発生を簡略表記に変更し、スペースを節約し、IMOで読みやすさを改善することをお勧めします。

66
Ahmad Mageed

制限された繰り返しを多く行う正規表現がある場合、{n,m}読みやすくするために一貫して形成します。例えば:

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

しかし、私は実生活でそのようなケースを見たことを今まで思い出せません。私が見るとき {0,1}{0,}または{1,}質問で使用されている、それは事実上常に無知から行われています。そして、そのような質問に答える過程で、彼らが?*または+代わりに。

そしてもちろん、 {1}は純粋な混乱です。一部の人々は、「1つだけ」を意味するという漠然とした概念を持っているようです。結局、somethingを意味するに違いありませんか?なぜこのような病理学的に簡潔な言語は、3文字全体を使用し、何もしない構造をサポートするのですか?私が知っている唯一の正当な使用法は、リテラル数字が続く後方参照を分離することです(例:\1{1}0)、しかしそれをする他の方法があります。

7
Alan Moore
  • 例外的な正規表現エンジンを使用している場合を除き、すべて同じです。ただし、すべての正規表現エンジンが番号付き繰り返しをサポートしているわけではありません。?または+

  • それらがすべて使用可能であれば、数字よりも文字を使用します。それは、私にとってより直感的だからです。

2
tiftik

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

私が予想する問題は、あなたがあなたのコードで作業する必要がある唯一の人ではないかもしれないときです。正規表現は、ほとんどの人にとって十分に困難です。誰かが異常な構文を使用するときはいつでも、「なぜ彼らは標準的な方法でそれをしなかったのですか?彼らは私が行方不明だと思っていたのですか?」という疑問が生じます。

1
dkretz