2

PCREでは、文字の繰り返しを3回または5回指定する次の方法よりも良い方法はありますか?

/(\d{3})|(\d{5})/

式を短くするための特別な反復量指定子はありますか?

4

2 に答える 2

0

/\d{3,5}?/ もしかして? キャプチャブラケットは本当に必要ですか?

于 2013-09-21T07:44:00.877 に答える
0

あなたもできると思います:

Edit2:貪欲な指定子 \d{2}?をオプションの量指定子に修正しました。

 /(\d{3}(?:\d{2})?)/

中括弧付き量指定子に関する追加コメント -

これを考慮してください:
フォームの指定された正確な量 {n,n}または{n}
貪欲な指定子の影響は何ですか?

Perlのドキュメントによると
{n}? Match exactly n times, not greedily
{n}+ Match exactly n times and give nothing back (redundant)

影響は何もありません。正確な量が一致する必要があること以外に意味はありません。
明らかにここに穴があります。

また、量指定子としてではなく 、リテラルとして解析されるsyntaxの形式の穴もあります。{,n}

これらのケースではエラーが生成されないため、かなり混乱します。

この形式に完全に適合する量指定子構造が必要であり、使用されています。

{n}? Match exactly n times, or match nothing

{,n,o,p, ..} Match the most either n,o,p, times (where n < o < p)
{,n,o,p, ..}? Match the least either n,o,p, times (where n < o < p)

これsyntax hole'が使用/埋められた場合、OPの質問は
簡単な方法で答えることができます/(\d{,3,5})/

より広い文脈では、これは正規表現に計り知れない力を追加します。
そしておそらく、このリストのような構文は
本質的にアトミックであるため、バックトラッキングが劇的に減少します。

@Tim Pietzcker の編集 - 返信
が遅れて申し訳ありません。Curyly 量指定子に「正確な」構造があるとは思いません。表記はショートカットです。あなたが示唆しているように、最小/最大しかありません(間違っている場合は修正してください)。Perl regex デバッガーでしか見ることができません。これは、表記法がエンジンから見たとおり{n}に解析されることを示唆しています。{n,n}最適化は変更されません。これは、すべてのドキュメント (およびすべてのドキュメントがこれを持っている) によると、正確な略記法で「可能な限り少ない」ままである、怠惰な量指定子に関する悪い紛らわしい表記法だと思います。この省略形は削除するか、実際に便利なものに使用する必要があると思います{n}?-省略形の(?:x{n})?. あなたのコメントとは関係ありませんが、それが私のポイントです。

于 2013-09-11T16:20:39.037 に答える