2016-04-03 5 views
1

Java Patternクラスでは、+などの量指定子だけの式、またはa++++などの追加量子は使用できず、どちらの場合も(メタキャラクタがぶら下がっているため)例外がスローされます。しかし、Patternクラスでは、文字間の空白にマッチする間隔限定子を単独で使用することができます({1}{2,6})。インターバル内の数字はそれほど重要ではないので、{1}{99999}は似ています(これは無限の「何もない」が同じスペースに収まる可能性があります)が、誤解を招く可能性があります。実際に正規表現は次のようになります。Javaパターンクラスの空の間隔量子

a{2} 
a{2}{34}{9999,99999} 
a{2}{45} 
a{2}+{234}+{9,999999999}? 

は有効なパターンであり、まったく同じです。したがって実際には役に立たない機能です。

私が知る限りRubyを除いてほとんどの正規表現フレーバでは、このような区間の使用は許可されていません。両方の型の数量子は等しく扱われ、有効なパターンを生成するためには定量化可能な要素の前に付ける必要があります。


Patternクラスでは、このような解決策の背後にはどのような理由がありますか? バグですか?エンジンの違い?異なる間隔で他の数値を扱うのはなぜですか?

答えて

1

なぜなら、Java開発者は間違っているからです。他の数量詞のように区間を扱わないことには言い訳がありません。私はチェックして、regexesが最初に追加されたとき、jdk1.4以来このようになっています。だから、それは回帰ではありませんが、私はそれをバグと呼んでいます。何も定量化しない点は何ですか?

私はの」2 としてa{2}{3}の治療、三回(?:a{2}){3}と同じ)、Rubyは何のファンではないんだけど、理にかなって、それは前例が少なくともその:GNU ERE(egrepを、awkの、emacs)も同じように動作します。

ところで、a{2}+は有効です - 愚かですが、有効です。私が知っている知っているすべての味は、所有量の定量化をサポートしていますが、無意味です。不本意な修飾子(a{2}?)と同じように、可変ではない量指定子では許可されないようにすると、許可するのと同じくらい混乱してしまいます。

しかし、{234}+{9,999999999}?はちょうど駄目です。 Javaで実際にコンパイルすることは私の心を吹き飛ばします。