2016-11-15 13 views
3

Javaのジェネリック型パラメータのための正規表現を必要とするので、私はして試してみた:

^[A-Z](([A-Z_0-9])*[^_])?$ 

は、タイプ名に大文字と数字のすべてが1文字以上必要であることを意味します。
セパレータとして '_'を使用しますが、最後には使用しません。fe 「TT_A9」
しかし、私の驚きに私の正規表現のツールは、「AA」または「AAA」または私がチェックするために、簡単なテストクラスを書いた
「AA-」の一致を示しています

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexTestPatternMatcher { 

public static final String test = "AA-"; 

public static void main(String[] args) { 
    Pattern pattern = Pattern.compile("^[A-Z](([A-Z_0-9])*[^_])?$"); 
    Matcher matcher = pattern.matcher(test); 
    System.out.println("Matches ? " + matcher.matches()); 
    } 
} 

出力:

AA- Matches ? true 

それは、AAAのためにも事実だが、私は正規表現^[A-Z](([A-Z_0-9])*[^_a-z-])?$
を使用しますが、私は使用する必要がなぜ私は理解していない場合AA_
のは作品ではありません「 -z 'と' - 'を除外として、
大文字のみを探しているときに!

+2

'[^ _]はハイフンを含む「アンダースコアを除く任意の文字」を意味します。 – chrylis

+0

@chrylis良いキャッチ、古典的なつかみ;-)正規表現の私の知識は少し錆びています – Rebse

答えて

2

元のパターンのようにnegated character classを使用する場合は、正規表現にクラスで定義されている文字以外の文字を使用するよう伝えます。だから、あなたの正規表現は実際には少なくとも2文字、最初は大文字のASCII文字、そして最後の文字は_ですが、_0-9、そしてA-Zの範囲の文字が間にあります。あなたは、文字列の最後に固定negative lookbehindを探している

^[A-Z][A-Z_0-9]*$(?<!_) 
       ^^^^^^ 

_は、文字列の末尾にある場合regex demo

それはすべての一致を失敗します参照してください。 _は使用されず、存在のみがチェックされているため、パターンは大文字のASCII文字で始まり、場合によっては[A-Z_0-9]文字クラスで定義された範囲の文字に続いて1文字の文字列を受け入れる(一致させる)。

冗長なグループをすべて削除することをお勧めします(キャプチャされたサブテキストを使用しないでください)。

+0

クイックレスポンスのおかげで、二重のアンダースコアを防ぐために正規表現を調整する方法は、A_AまたはA_9が有効であるのに対して、 。 – Rebse

+1

それで、パターンを '^ [A-Z] [A-Z0-9] *(?:_ [A-Z0-9] +)* $' –

+0

に改造する方が簡単です。 1つの大文字を許可するために、^ [AZ] [A-Z0-9] *(?:_ [A-Z0-9] +)のような2番目の正規表現を作成しましたか?$ – Rebse

関連する問題