2011-08-18 8 views
5

はI現在、1から12までの入力を表すために(許可されていない先頭のゼロを。)([1-9]|1[0-2])を使用してい正規表現の番号範囲(1から12など)を表す方法は?

しかし、それはむしろ思わハック、およびいくつかの日に、それは、あからさま汚いを探します。

☞それにはが適切ですか?がありますか?

☞番号範囲を表す他の方法は何ですか?

+0

「大きい方が良い」の場合、(1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12) – Ingo

+0

@Ingoは、 – Pacerier

+0

の前に私の思考を越えていなかったことを率直に言っていますが、それは何らかの意味で最も単純な解決策であり、あなたがおそらく望むものについてのヒントを与えます。 – Ingo

答えて

4

を得ることはありませんここではほとんど違いはありませんが、[2-9]|1[0-2]?のような形式でバックトラックを回避します。私は正規表現はそれらをうまく処理することができますが、そのような "あいまいさ"を避けるためにXMLスキーマによって調整されてきました。

+0

基本的に、マッチャーが "1"文字を見るとき、 "意味"はより多くの文字を見るまで曖昧です。 [1-9]は「1」、1 [0-2]は「1」ですか?正規表現は意味を気にしませんが、あいまいさが解消されるまで、正規表現では両方のブランチをアクティブにしなければならないので、それは効率的な問題です。 – xan

+0

正規表現のマシンでは、これが最も速い解決策であると言っています:1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12? – Pacerier

+0

いいえ、私は '[2-9]と' 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9'を比較しません - どちらが速いのか分かりません。私は '1 | 10'と' 10? 'を比較しています。そのような簡単な例では問題はありませんが、より多くの関与する正規表現に対しては、共通の接頭辞を削除するのに役立ちます。おそらくもっと良い例: 'ab | ac'は' a(b | c) 'に改善されました。 – xan

6

あなたが使用することができます。

[1-9]|1[012] 
8

はい、正しいものを:

[1-9]|1[0-2] 

そうでなければ、あなたは、私が行く傾向にある10

+0

heyは私の編集した質問を参照 – Pacerier