
正規表現を使用して入力チェックをしようと考えていますが特殊記号文字がうまくいきません。
[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!"#$%&'()=~|`{+*}<>?_-^\@[;:],./]
^
申し訳ありませんがアドバイスいただけませんでしょうか?
宜しくお願いします。
No.5ベストアンサー
- 回答日時:
問題のキャラクターをエスケープしたら、
>「エスケープ・シーケンスが無効です」
とメッセージが出たということですね。
これは、Perl などの言語と違って、Javaでは正規表現を一旦文字列として
記述して、それをライブラリの入力として与えなければならないことに
原因があります。
つまり、正規表現で使うエスケープ用の記号も '\' で、同時に文字列で
エスケープに使う記号も'\' なので、正規表現として '\' を表すには
文字列では '\\' と記述しないといけないということです。
具体例を挙げると、
_\-^
という正規表現を渡すためには、
"_\\-^"
という文字列を記述しないといけません。そうしないと、Javaの文字列
のエスケープとして解釈されてしまうので
>「エスケープ・シーケンスが無効です」
となってしまうわけです。
だから、「正規表現で\」を記述するには
"\\\\" → 「文字列のエスケープを処理」→ \\ → 「正規表現のエスケープを処理」
→ \
と、"\\\\" とする必要があったりします。
この回答への補足
回答ありがとうございます。
なるほど、ちょっと試してみます。
進展がありましたら投稿しますのでお待ち下さい。
宜しくお願いします。
No.4
- 回答日時:
> 「!"#$%&'()=~|`{+*}<>?_-^\@[;:],./」
いきなりこれだけの記号を試すのではなく、1つずつ試していってはいかがですか?
> それ以外にエスケープしようとすると「エスケープ・シーケンスが無効です」とエラーになります。
と仰るのが具体的にどの文字なのか分かりませんが、1つずつ試せば分かるはずなので、その文字をエスケープする方法、という形に絞って検索するなり、質問するなりできると思います。
この回答への補足
回答ありがとうございます。
1つ1つ記述して試してみます。
進展がありましたら投稿しますのでお待ち下さい。
宜しくお願いします。
No.3
- 回答日時:
/*
久々に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");
}
}
}
}
この回答への補足
回答ありがとうございます。
ロジックを記述していただきありがとうございます。
しかし、私には難しいです。
すみませんが正規表現ではできないのでしょうか。
再度、宜しくお願いします。
No.2
- 回答日時:
ブラケットの中の記号に
_-^
と並んでいる部分がありますよね。
ここが、_、-、^という三つのキャラクターではなく
_から^までの範囲の指定と解釈され、かつ、_は^よりも
「順番があとのキャラクター」なので
Illegal character range
となってます。
-はブラケットの中で特別の意味を持っていますから、それを打ち消すための
エスケープが必要です。
^も特別な意味がありますが、先頭になければそのままでも大丈夫でしょう。
あ、あと[と]も要エスケープですね。
この回答への補足
回答ありがとうございます。
Eclipseで作成しています。
「\」と「"」はエスケープしないとエラーになったのでエスケープしました。
またそれ以外にエスケープしようとすると「エスケープ・シーケンスが無効です」とエラーになります。
どのようにしたらいいのでしょうか。
アドバイス宜しくお願いします。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Eclipseで、プロジェクト名のと...
-
タグが閉じてないというエラー...
-
エラー:org.springframeworkが...
-
tomcat起動時エラー
-
構文エラーのやり直しについて
-
Eclipseの環境について
-
JSP/サーブレットで一般的な入...
-
Javaのエラーについてです
-
JSPのデバッグの方法がわかりま...
-
antについて
-
Eclipse デバッグ エラー処理
-
javaサーブレットからのoracle...
-
Eclipseで次のエラー箇所にジャ...
-
Eclipseのソース添付について
-
メインクラス○○.classが見つか...
-
Strutsのbean:writeにclassを適...
-
Hot code replace failed ?
-
正規表現で入力チェックするには。
-
javamailのインポートでエラー
-
外部JavaScriptのエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Eclipseで、プロジェクト名のと...
-
エラー:org.springframeworkが...
-
タグが閉じてないというエラー...
-
コンパイル時にエラーが出てし...
-
構文エラーのやり直しについて
-
tomcat起動時エラー
-
Eclipseの環境について
-
eclipseでのsvn認証エラー回避方法
-
eclipseをバージョンアップした...
-
Javaのエラーについてです
-
「型 ArrayList は総称ではあり...
-
JSP内でString型からint型に変...
-
JSPで意味不明のコンパイルエラー
-
JSP NullPointerException
-
Eclipse デバッグ エラー処理
-
getParameterについて
-
eclipseのエラーについて質問で...
-
【ジェネリックス】コンパイル...
-
Buttonを配列とすることができ...
-
JSPページから、同じJSPページ...
おすすめ情報