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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1182閲覧

java 正規表現 maches find

goldfish.paiza

総合スコア13

Java

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2019/07/12 18:57

javaの正規表現について質問します。
任意の文字列に対して文字列チェックを行いたいです。
チェックの内容としては、任意の文字列の中に指定する
文字列が入っているかのチェックです。
チェックの内容は下記の通りです。
指定する文字がそのまま含まれるか、指定文字の間に1文字だけ異なる文字が含まれる場合はOK。
2文字以上異なる文字が間に入ればNG。
例:指定文字→apple
任意の文字→①djsapplesdf(OK,appleの間に0文字) 
②klfappolekkk(OK,appleの間に1文字) 
③lroapewplejg(NG,appleの間に2文字)

正規表現を使ってfind()を使ってチェックすると、下記入力値の場合に
trueを返してきますが、なぜfalseにならないのでしょうか。
<trueになってしまうパターン>
指定文字(正規表現)→.ma.iza.
任意の文字→maxizya

java

1コード 2import java.util.*; 3import java.util.regex.Pattern; 4import java.util.regex.Matcher; 5 6public class Main { 7 public static Scanner sc = new Scanner(System.in); 8 public static int TicketCount = sc.nextInt(); 9 public static String SearchWord = sc.next(); 10 public static int SearchLength = SearchWord.length(); 11 public static void main(String[] args) { 12 String word = ""; 13 int offset = 0; 14 for(int n = 0; n < TicketCount; n++){ 15 String TicketWord = sc.next(); 16 for(int i = 1; i < SearchLength; i++){ 17 word = fncMakeRegex(i); 18 String regex = ".*" + word + "*."; 19 Pattern p = Pattern.compile(regex); 20 Matcher m = p.matcher(TicketWord); 21 22 if(m.find()){ 23 System.out.println("含まれる"); 24 } else { 25 System.out.println("含まれない"); 26 } 27 } 28 } 29 } 30 31 public static String fncMakeRegex(int offset){ 32 StringBuilder sb = new StringBuilder(); 33 sb.append(SearchWord); 34 sb.insert(offset, "."); 35 String str = new String(sb); 36 return str; 37 } 38}

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

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

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

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

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

guest

回答2

0

指定文字(正規表現)→.ma.iza.
任意の文字→maxizya

*は0個以上なので

正規表現マッチ
.*(0文字)
mama
.x
iziz
a*(0文字)
.y

となりマッチしていますよ。

wordが含まれるか判定したいのであれば、

Java

1String regex = ".*" + word + "*.";

ではなく

Java

1String regex = ".*" + word + ".*";

では?

投稿2019/07/12 19:50

編集2019/07/12 20:28
SHOMI

総合スコア4079

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

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

goldfish.paiza

2019/07/13 01:51

yはizとaの間に入っています。「.*ma.iza*.」のチェックでは「maxiza」(aとiの間に1文字)は良いけど「maxizya」(zとaの間に1文字)はfalseにしたいです。正規表現の文字列にzとaの間に「.」は入れていないのになぜ通ってしまうのでしょう。
SHOMI

2019/07/13 03:53

「a*」と書くと0個以上の「a」とマッチするためです。
SHOMI

2019/07/13 04:06

回答の表に正規表現がどの部分とマッチしているのか書いているので参考にしてください。
goldfish.paiza

2019/07/14 15:29

解決できました、ありがとうございます。 *の0個以上というのをよく理解できていませんでした。*.を.*にすれば上手くいきました。
guest

0

ベストアンサー

指定文字(正規表現)→.ma.iza.

これだと「0文字以上の任意の文字列の後にmaが来て、その後に陰萎の1文字が来て、その後にizがきて、その後に0文字以上のaが来て、その後に任意の位置文字が来る」というパターンになりますね。maxizyaはしっかりマッチします。

最後は*.ではなく.*なんじゃないでしょうか。

投稿2019/07/12 19:49

編集2019/07/13 05:39
KojiDoi

総合スコア13671

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

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

goldfish.paiza

2019/07/13 01:52

yはizとaの間に入っています。「.*ma.iza*.」のチェックではzとaの間に「.」は入れていないのになぜ通ってしまうのでしょう。
KojiDoi

2019/07/13 05:39

a*は「aの0個以上の繰り返し」です。最後の.にyがマッチします。
goldfish.paiza

2019/07/14 15:29

解決できました、ありがとうございます。 *の0個以上というのをよく理解できていませんでした。*.を.*にすれば上手くいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問