質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

44826閲覧

Javaの、半角記号のパターンマッチングについてです。

churi_yuzuki

総合スコア32

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

2クリップ

投稿2016/08/10 07:15

###前提・実現したいこと
文字列に、半角英数記号(ただし記号は「_-@+*;:#$%&」)以外が含まれているかの判定を行い、含まれていれば、「半角英数記号で入力してください。」と表示させたい。

###発生している問題
正規表現の使い方が良く分からなくて詰まってます。

###該当のソースコード

Java

1if(!(str.matches("_-@+*;:#$%&") || str.matches("[0-9a-zA-Z]"))){ 2 System.out.println("半角英数記号で入力してください。"); 3}

よろしくお願いします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

[ ]で囲まれたものはその集合のどれか1文字に一致することを表します。
英字は[A-Z][a-z]、数字は[0-9]、記号(今回の場合)は[_-@+*;:#$%&]です。
これらはまとめて書くことができます。
ハイフンはそのままだと別の意味(範囲を表す)になってしまうので、先頭に置くか、エスケープします。

1文字以上なので、+をつけます。
[-_@+*;:#$%&A-Za-z0-9]+となります。

また、A-Za-z0-9_\wと書くことができます。ただし、Javaの正規表現は文字列として書かなければならず、\を書く場合はそれ自体をエスケープする必要があり、\\wと書きます。(sipadan2003さんにコメントでご指摘いただいた通りです。)
正規表現リテラルがある言語などでは、エスケープせずに書くことができるものもあります。

String#matchesメソッドは、文字列全体にマッチしますのでこれで完成です。

(追記)root_jpさんのコメントのとおり、\w_を含む、が正しいです。\wにした場合は単独の_は消してOKです。
ドキュメントにはこう書かれています。

\w 単語構成文字: [a-zA-Z_0-9]

参考リンク:

java.util.regex.Pattern - Java SE 8 API ドキュメント
https://docs.oracle.com/javase/jp/8/docs/api/java/util/regex/Pattern.html

投稿2016/08/10 08:05

編集2016/08/12 08:48
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/10 17:23

エスケープするということは「\」をつけることを意味します。 しかし、「\」自体も特殊な記号なので、プログラム上では「\\」と書く必要があります。 よって、「\w」はプログラミングする際は「\\w」と書くことになります。
argius

2016/08/10 17:45

sipadan2003さん ご指摘ありがとうございます。おっしゃる通りエスケープについての配慮が欠落していました。 本文に追記しました。
churi_yuzuki

2016/08/12 05:02

ご回答ありがとうございます。 .matches("[-_@+*;:#$%&A-Za-z0-9]+")、もしくは .matches("[-_@+*;:#$%&\\w]+") とすればよいということでしょうか?
argius

2016/08/12 05:28

その部分についてはそれでOKです。 最終的な判断は、ご自身で実際に動作させてみてからにして下さい。
churi_yuzuki

2016/08/12 08:06

無事に動作しました。 ありがとうございます。 エスケープシーケンスについてもっと学びたいと思います。
root_jp

2016/08/12 08:30

\wはアンダーバーも含むので、アンダーバーは消しても大丈夫です。
argius

2016/08/12 08:49

root_jpさん コメントありがとうございます。 おっしゃるとおりです。ドキュメントの引用を追記の上修正しました。
guest

0

java

1if (!str.matches("^[-@+*;:#$%&\\w]+$")) { 2 System.out.println("半角英数記号で入力してください。"); 3}

投稿2016/08/10 07:38

root_jp

総合スコア4666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

root_jp

2016/08/12 08:28

\wはアンダーバーも含むので、アンダーバーは消しても大丈夫です
churi_yuzuki

2016/08/12 09:04

ご回答ありがとうございます。 実行できました。 +$という表記でアルファベットと数字を表しているのでしょうか。
root_jp

2016/08/12 10:34 編集

+は[]の中に羅列されている文字で1文字以上の繰り返しという意味です。 ようは[]の中の文字だけで構成された文字列かどうかってことになります。 +を使うと未入力の場合もエラーになってしまいそうなので、未入力を許可したい場合は、+の代わりに*を使うといいと思います。 *は0文字以上です。入力がないか、[]の中の文字だけで構成されたものかってことになります。 $は文字の最後という意味です。先頭にある^は文字の先頭という意味です。 文字の先頭から最後まで、[]の中の文字列だけで構成されているか?という意味なのですが、argiusさんの回答にある通り、String#matchesは文字列全体に一致するので、 String#matchesを使う場合には、^と$は不要ですね。 僕も勉強なりました。
root_jp

2016/08/12 10:36 編集

すみません。。。上のコメントで呼び捨てにしてるのはミスです。 argiusさんです!(修正しました。) 大変失礼しました。
argius

2016/08/12 11:45

こちらこそ、ミスのご指摘ありがとうございました。
churi_yuzuki

2016/08/22 07:56

大変遅くなりました。 お二人ともありがとうございます。 とても参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問