アプリ版:「スタンプのみでお礼する」機能のリリースについて

正規表現を使用して入力チェックをしようと考えていますが特殊記号文字がうまくいきません。

[0-9a-zA-Z]で英数字はチェックする事ができたんで下記の特殊文字を指定するとエラーになってしまい困っています。
「!"#$%&'()=~|`{+*}<>?_-^\@[;:],./」

ロジックは以下のように記述しています。
Pattern p = Pattern.compile("[0-9a-zA-Z!\"#$%&'()=~|`{+*}<>?_-^\\@[;:],./]");
Matcher m = p.matcher("文字列");
if(m.matches() == true){
  System.out.println("1");
}
else{
  System.out.println("2");
}
※「\」と「"」はエスケープしています。

下記のエラーメッセージが表示されてなんとなくですが正規表現でエラーになっているのはわかるんですが・・・

Illegal character range near index 32
[0-9a-zA-Z!"#$%&'()=~|`{+*}<>?_-^\@[;:],./]
                      ^

申し訳ありませんがアドバイスいただけませんでしょうか?
宜しくお願いします。

A 回答 (5件)

問題のキャラクターをエスケープしたら、


>「エスケープ・シーケンスが無効です」
とメッセージが出たということですね。

これは、Perl などの言語と違って、Javaでは正規表現を一旦文字列として
記述して、それをライブラリの入力として与えなければならないことに
原因があります。

つまり、正規表現で使うエスケープ用の記号も '\' で、同時に文字列で
エスケープに使う記号も'\' なので、正規表現として '\' を表すには
文字列では '\\' と記述しないといけないということです。
具体例を挙げると、
_\-^
という正規表現を渡すためには、
"_\\-^"
という文字列を記述しないといけません。そうしないと、Javaの文字列
のエスケープとして解釈されてしまうので
>「エスケープ・シーケンスが無効です」
となってしまうわけです。

だから、「正規表現で\」を記述するには 
"\\\\" → 「文字列のエスケープを処理」→ \\ → 「正規表現のエスケープを処理」
→ \
と、"\\\\" とする必要があったりします。

この回答への補足

回答ありがとうございます。

なるほど、ちょっと試してみます。
進展がありましたら投稿しますのでお待ち下さい。
宜しくお願いします。

補足日時:2009/11/01 20:52
    • good
    • 0
この回答へのお礼

みなさんのおかげでチェックする事ができました。
本当にありがとうございました。

お礼日時:2009/11/02 11:51

> 「!"#$%&'()=~|`{+*}<>?_-^\@[;:],./」



いきなりこれだけの記号を試すのではなく、1つずつ試していってはいかがですか?

> それ以外にエスケープしようとすると「エスケープ・シーケンスが無効です」とエラーになります。

と仰るのが具体的にどの文字なのか分かりませんが、1つずつ試せば分かるはずなので、その文字をエスケープする方法、という形に絞って検索するなり、質問するなりできると思います。

この回答への補足

回答ありがとうございます。

1つ1つ記述して試してみます。
進展がありましたら投稿しますのでお待ち下さい。
宜しくお願いします。

補足日時:2009/11/01 20:49
    • good
    • 0

/*


久々にsakusaker7さん見かけたなーと。
このコードどう思う?
*/

class x{

public static void main(String[] args){
/*java.util.regex.Pattern p = java.util.regex.Pattern.compile("^[\\p{ASCII}&&[\\P{C}]]$"); */
java.util.regex.Pattern p = java.util.regex.Pattern.compile("^[\\p{ASCII}&&[^\\p{C}]]$");

for(int i = 0;i < 128 ; i++){
if(p.matcher(java.lang.Character.toString(java.lang.Character.toChars(i)[0])).matches()){
System.out.println(Integer.toString(i) + ":" + "YES");
}else{
System.out.println(Integer.toString(i) + ":" + "No");
}
}
}
}

この回答への補足

回答ありがとうございます。

ロジックを記述していただきありがとうございます。
しかし、私には難しいです。

すみませんが正規表現ではできないのでしょうか。
再度、宜しくお願いします。

補足日時:2009/10/31 23:04
    • good
    • 0

ブラケットの中の記号に


_-^
と並んでいる部分がありますよね。
ここが、_、-、^という三つのキャラクターではなく
_から^までの範囲の指定と解釈され、かつ、_は^よりも
「順番があとのキャラクター」なので
Illegal character range
となってます。

-はブラケットの中で特別の意味を持っていますから、それを打ち消すための
エスケープが必要です。
^も特別な意味がありますが、先頭になければそのままでも大丈夫でしょう。
あ、あと[と]も要エスケープですね。

この回答への補足

回答ありがとうございます。
Eclipseで作成しています。
「\」と「"」はエスケープしないとエラーになったのでエスケープしました。
またそれ以外にエスケープしようとすると「エスケープ・シーケンスが無効です」とエラーになります。

どのようにしたらいいのでしょうか。
アドバイス宜しくお願いします。

補足日時:2009/10/31 23:02
    • good
    • 0

こんにちは、正規表現にメタ文字対策がないみたいですが。


この辺の問題では、ないんですか??

http://www.mnet.ne.jp/~nakama/regexp1.html
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!