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

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

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

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

Q&A

解決済

3回答

1589閲覧

日本語を弾く正規表現について

blueky

総合スコア2

Java

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

0グッド

0クリップ

投稿2022/05/10 07:34

正規表現について
Javaのjava.lang.String.matchesを用いて、文字列に日本語が含まれるとエラーとしたいのですがうまくいきません。
例えば、下記のソースでひらがな、カタカナ、漢字があると弾く想定なのですが、想定通りに行かずです...
if (str.matches("^[ぁ-んーァ-ヶー一-龠]+$")){
System.out.println("日本語は使用しないでください");
}

①あああ
②あああaa
③aaaあああ
④aaaあああaaa

①だとうまく弾いてくれるのですが、②③④だと弾いてくれません。
+$を*$にしても同様の事象です。
原因と正しい記述法を教えていただきたいです。

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

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

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

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

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

m.ts10806

2022/05/10 07:49

ブラックリストではなくホワイトリストで試したほうが楽かもしれません。 つまり「許可するもののみ」です。
jimbe

2022/05/10 12:31

matches でなく (^や+,$を抜いて) find では?
xebme

2022/05/10 20:31

日本語の定義が曖昧ですね。unicodeの半角カナ領域は日本語ですか。
guest

回答3

0

ベストアンサー

文字列に日本語が含まれるとエラーとしたいのですが

「日本語ってなに?」というはなしになりませんか。\u3000は日本語でしょうか? ニホンは日本語でしょうか? πは?

使用を許可する文字にマッチさせるほうがよっぽど簡単なのでわ。

java

1import org.junit.jupiter.api.Test; 2import java.util.Arrays; 3 4public class Hoge { 5 @Test 6 public void hoge() { 7 final String pattern = "^[\u0000-\u007f]*$"; 8 9 Arrays.asList( 10 "あああ", 11 "あああaa", 12 "aaaあああ", 13 "aaaあああaaa", 14 "", 15 "aaa", 16 "aa bbb", 17 "aa\tnbbb", 18 "aa\u3000bbb", 19 "1234567890", 20 "*&^*#^!(!*&", 21 "[]{}..,,<>", 22 " ", 23 "ニホン", 24 "π" 25 ).stream().forEach(text -> { 26 final String message = text.matches(pattern) ? "OK" : "日本語は使用しないでください"; 27 System.out.println(String.format("<%s> %s", text, message)); 28 }); 29 } 30}
<あああ> 日本語は使用しないでください <あああaa> 日本語は使用しないでください <aaaあああ> 日本語は使用しないでください <aaaあああaaa> 日本語は使用しないでください <> OK <aaa> OK <aa bbb> OK <aa nbbb> OK <aa bbb> 日本語は使用しないでください <1234567890> OK <*&^*#^!(!*&> OK <[]{}..,,<>> OK < > OK <ニホン> 日本語は使用しないでください <π> 日本語は使用しないでください

投稿2022/05/10 14:04

編集2022/05/10 14:08
shiketa

総合スコア3971

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

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

blueky

2022/05/11 05:28

ありがとうございます。使用を許可する文字にマッチさせました。
guest

0

if (str.matches("^[ぁ-んーァ-ヶー一-龠]+$")){

^は先頭
$は最後
を表します。
なので、この表記では、先頭から最後まで[ぁ-んーァ-ヶー一-龠]が連続するという意味になります。

したがって、単純に以下で十分です。[ぁ-んーァ-ヶー一-龠]が1文字でも含まれればという意味

java

1if (str.matches("[ぁ-んーァ-ヶー一-龠]")){

ただし、言語やライブラリによって、先頭からマッチする関数だったりしなかったりするので、そこはちゃんと調査してください。

まあ、momon-gaさんのいうとおり、ホワイトリストにしたほうが良いかと思います。

投稿2022/05/10 09:34

KeisukeOkada

総合スコア43

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

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

blueky

2022/05/11 05:29

ありがとうございます。 ^は先頭 $は最後 の説明分かりやすかったです。
guest

0

if (str.matches("^[ぁ-んーァ-ヶー一-龠]+$")){
System.out.println("日本語は使用しないでください");
}

書いてある内容を、ちょっと変えますが・・・

if (str.matches("^[0-9]+$")){

と、書いた場合、判定しているのは数字だけでstrが構成されているかです。

つまり、書いた通り

①だとうまく弾いてくれるのですが、②③④だと弾いてくれません。

の挙動になっています。

私もホワイトボックスの方が楽じゃないかと思いますが、そもそもその正規表現が日本語全部なのか知らないですし・・・

もとの正規表現を生かすなら

java

1if (str.matches(".*[ぁ-んーァ-ヶー一-龠].*")){ 2 System.out.println("日本語は使用しないでください"); 3}

みたいな感じじゃなかろうかと

投稿2022/05/10 08:31

momon-ga

総合スコア4820

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

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

blueky

2022/05/11 05:29

ありがとうございます。 ご指摘の通りホワイトボックスにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問