2016-11-04 5 views
1

私はJava正規表現を使いこなしていますが、それ以外のところで特定の文字セットを許可するパターンを考え出していますが、許可されたセット内の特定の文字で始めることはできません。Java Regex:特定の文字のみを許可しますが、特定の文字はその文字列を開始できませんか?

たとえば、許可される文字はAからZですが、文字列はXまたはZで始めることはできません。どうすればよいですか?私は^[XZ][^A-Z]+を用意しました。それ以外の場合は動作しますが、文字列はセットに含まれていない他の文字(句読点など)で始まることができます。

+0

'[A-WY]'はどうですか? – ajb

答えて

5

あなたは、この正規表現を使用することができます

^[A-WY][A-Z]*$ 
  • ^[A-WY]を最初の文字がA-WまたはY
  • [A-Z]*$は、任意の大文字の英字

の0以上にマッチしますであることを保証一般的には、特定の文字を除外するまた、負の先読みを使用します。

^(?![XZ])[A-Z]+$ 

(?![XZ])は、開始時にXまたはZを許可しないように否定先読みです。

+0

許可された文字の正規表現がハイウエージである場合は、どうしてもそれを繰り返す必要がありますか? 2つの文字を除外する方法はありますか? – manabreak

+0

最初に負の先読みを使用して特定の文字を除外するように更新された回答を確認してください。 – anubhava

+0

ありがとう!あなたの答えの最後の部分がその場に出ました。早く受け入れます。 – manabreak

1

Java正規表現は、文字クラスの減算をサポートします。だから、あなたはそれが本当にここに必要とされていないXまたはZを除く任意の大文字のASCII文字を意味する

[A-Z&&[^XZ]] 

を言うことができる

[a-z&&[^bc]] a through z, except for b and c: [ad-z] (subtraction) 
[a-z&&[^m-p]] a through z, and not m through p: [a-lq-z](subtraction) 

が、次の場合にこれらを例として示しており、http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.htmlを参照してくださいPosixの文字クラスのような大きなクラスを使用していると、もっと便利になる可能性があります。

警告:すべての言語が正規表現でこの構文をサポートしているわけではありません。私は、C++とJavascriptはそうではないと確信しています。実際には私がチェックしていない別の言語については知りません。

+2

JSがこれをサポートすれば、私は驚いています。彼らはlookbehindsをサポートしていません:(これは良い答えです – TheLostMind

+0

ドキュメントはそれを減算と呼んでいますが、それは交差点の特徴を乱用しています。また、.netとpythons regexモジュールの減算をサポートしています。@TheLostMind JS –

+0

@SebastianProske - はい、多くの言語がこれをサポートしていません(ajbはこれを明示しています):) – TheLostMind

関連する問題