2

クラス名で始まり、クラス名の間にドットがあり、文字で始まるクラス名で終わる正規表現パターンを書きたいと思います.Javaのクラスインポートのようなものです.

このパターンを書きましたが、検証するには複雑すぎて時間がかかり、適切に動作しないと思います

^([a-zA-Z]([0-9]|_|[a-zA-Z])*)(([a-zA-Z]([0-9]|_|[a-zA-Z])*)|\\.)*([a-zA-Z]([0-9]|_|[a-zA-Z])*)$

たとえば、入力文字列は次のようになります。「com.casp.common.StringUtils」

4

2 に答える 2

2

次のことだけで何が問題なのですか:

^([a-zA-Z][a-zA-Z0-9_]*\.?)+$

クラス名は、パッケージが 1 つある限り、その中の任意の数のパッケージと一致します。少なくとも 2 つのインスタンスが必要な場合は、次の方法でも問題なく動作します。

^([a-zA-Z]+)\.([a-zA-Z][a-zA-Z0-9_]*\.?){1,}$
于 2012-07-08T07:55:02.233 に答える
2

まず、単純化:

[0-9]|_|[a-zA-Z]

として組み合わせることができます

[0-9_a-zA-Z]

実際には簡略表現があります

\w

したがって、最初に正規表現を次の同等の形式に単純化できます。

^([a-zA-Z](\w)*)(([a-zA-Z](\w)*)|\.)*([a-zA-Z](\w)*)$

ここで、冗長なキャプチャ グループをいくつか削除することでさらに簡素化し、大文字と小文字を区別しないマッチングを有効にすることができます。

^[a-z]\w*([a-z]\w*|\.)*[a-z]\w*$

もちろん、この正規表現は正しくありません。たとえば、 に一致a....bします。

問題は、各コンポーネント間にドットが必要な\.ため、「代替」であってはならないためです。したがって、おそらく次のように変換する必要があります。

^[a-z]\w*([a-z]\w*\.)*[a-z]\w*$

a.bしかし、先頭部分のために一致しないため、それでも正しくありません。それを削除する必要があります。

^([a-z]\w*\.)*[a-z]\w*$

おそらく、繰り返し部分が最初ではなく最後になるように再配置します。

^[a-z]\w*(\.[a-z]\w*)*$
于 2012-07-08T08:00:02.000 に答える