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

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

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

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

1回答

237閲覧

正規表現とArrayListを使ったコードについて

hakumai

総合スコア3

Java

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2024/05/09 13:55

編集2024/05/09 23:01

実現したいこと

userIdArrayにあるID(ASD1234,asdfgh1,aSd1234,asd1223,mmm1234,1234ASD)を正規表現でチェックし、OKリストとNGリストに振り分けたいです。
【チェック内容】
・1~3文字目は大文字半角英字→OKリストへ
・4~7文字目は半角数字→OKリストへ
・7文字以上→OKリストへ
・その他→NGリストへ

↓のような出力内容にしたいです。(IDの出力順序は問いません)
OKリスト---------------
・ASD1234
NGリスト---------------
・asdfgh1
・aSd1234
・asd1223
・mmm1234
・1234ASD

発生している問題・分からないこと

【for文とif文を使ったver】と【配列をArrayListに変換し、最後にリストを取り出す形のver】を書いてみたのですが、どちらも引数に適用できないという下記のエラーメッセージが出てきてしまいます。

エラーメッセージ

error

1【for文とif文を使ったver】 2Exception in thread "main" java.lang.Error: Unresolved compilation problems: 3 型 Pattern のメソッド matcher(CharSequence) は引数 (int) に適用できません 4 型 Pattern のメソッド matcher(CharSequence) は引数 (int) に適用できません 5 型 List<String> のメソッド add(int, String) は引数 (int) に適用できません 6 型 List<String> のメソッド add(int, String) は引数 (int) に適用できません 7 8 at Main.main(Main.java:14) 9 10【配列をArrayListに変換し、最後にリストを取り出す形のver】 11Exception in thread "main" java.lang.Error: Unresolved compilation problems: 12 型 Pattern のメソッド matcher(CharSequence) は引数 (int) に適用できません 13 型 Pattern のメソッド matcher(CharSequence) は引数 (int) に適用できません 14 型 List<String> のメソッド add(int, String) は引数 (int) に適用できません 15 型 List<String> のメソッド add(int, String) は引数 (int) に適用できません 16 17 at Main.main(Main.java:14) 18

該当のソースコード

//for文とif文を使ったver import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String[] userIdArray = {"ASD1234","asdfgh1","aSd1234","asd1223","mmm1234","1234ASD"}; List<String> okList= new ArrayList<>(); List<String> ngList = new ArrayList<>(); for(int i = 0; i<userIdArray.length; i++){ //配列繰り返し Pattern p1 = Pattern.compile("^[A-Z]{3}"); //1~3文字目は大文字半角英字を設定する Matcher m1 = p1.matcher(i); Pattern p2 = Pattern.compile("[0-9]{4-7}"); //4~7文字目は半角数字を設定する Matcher m2 = p2.matcher(i); if(m1.find() && m2.find() && userIdArray.length >=7){ //7文字以上はOK okList.add(i); }else{ ngList.add(i); } System.out.println("OKリスト---------"); for(int i1 = 0; i1<okList.size(); i1++){ System.out.println(okList.get(i1)); } System.out.println("NGリスト---------"); for(int i1 = 0; i1<ngList.size(); i1++){ System.out.println(ngList.get(i1)); } } } }
//配列をArrayListに変換し、最後にリストを取り出す形のver import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main{ public static void main(String[] args) { String[] userIdArray = {"ASD1234","asdfgh1","aSd1234","asd1223","mmm1234","1234ASD"}; ArrayList<String> idList = new ArrayList<String>(Arrays.asList(userIdArray)); //配列からリストに変換 System.out.println("チェックOKリスト-------------"); List<String> okList = idList.stream() //リストとして取り出す .filter("^[A-Z]{3}","[0-9]{4-7}") .collect(Collectors.toList()); System.out.println("チェックNGリスト-------------"); List<String> ngList = idList.stream() .filter(idList.size()<=7) .filter("^[?!.*A-Z]{3}.*","[?!.*0-9]{4-7}.*") .collect(Collectors.toList()); } }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

【for文とif文を使ったver】で、最初はif()の中に直接正規表現を書いていたのですが、patternとmatchでチェックするという記載が出てきたので、使いました。

補足

【for文とif文を使ったver】【配列をArrayListに変換し、最後にリストを取り出す形のver】片方だけの回答でも助かります。よろしくお願いいたします。

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

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

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

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

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

jimbe

2024/05/09 18:41

>・1~3文字目は大文字半角英字→OKリストへ >・4~7文字目は半角数字→OKリストへ >・7文字以上→OKリストへ この書き方だとどれか1つを満たせば OK のように見えますが、実際は3つとも満たさなければならないということであっていますか?
hakumai

2024/05/09 23:14

申し訳ございません、説明不足でした。3つとも満たすということで合っております。
guest

回答1

0

ベストアンサー

型 Pattern のメソッド matcher(CharSequence) は引数 (int) に適用できません
Matcher m1 = p1.matcher(i);

メッセージをきちんと読まれていないようです。
matcher には対象となる文字列(CharSequence)を指定しなければならないのに i を渡しているのでダメだと言われています。

public Matcher matcher(CharSequence input)

たとえば、

Matcher m1 = p1.matcher(userIdArray[i]);

のように渡さなければなりません。

また、 Pattern.compile はループの中で何度もしなければならないようなことではありませんし、 Pattern を二つに分ける必要も無さそうですし、ok/ngListの表示も振り分けてからでよいのではありませんか?

java

1import java.util.*; 2import java.util.regex.*; 3 4public class Main { 5 public static void main(String[] args) { 6 String[] userIdArray = { "ASD1234", "asdfgh1", "aSd1234", "asd1223", "mmm1234", "1234ASD" }; 7 8 List<String> okList = new ArrayList<>(); 9 List<String> ngList = new ArrayList<>(); 10 11 Pattern p = Pattern.compile("[A-Z]{3}[0-9]{4}.*"); 12 13 for(String userId : userIdArray) { 14 if(p.matcher(userId).matches()) { 15 okList.add(userId); 16 } else { 17 ngList.add(userId); 18 } 19 } 20 21 System.out.println("OKリスト---------"); 22 System.out.println(okList); 23 24 System.out.println("NGリスト---------"); 25 System.out.println(ngList); 26 } 27}
OKリスト--------- [ASD1234] NGリスト--------- [asdfgh1, aSd1234, asd1223, mmm1234, 1234ASD]

【配列をArrayListに変換… ver】改め stream 版では、 ok/ng を true/false としてキーにする Map に集めるようにすることで、stream から二度集めたり二つの正規表現を扱う必要を無くします。

java

1import java.util.*; 2import java.util.regex.*; 3import java.util.stream.*; 4 5public class Main { 6 public static void main(String[] args) { 7 String[] userIdArray = { "ASD1234", "asdfgh1", "aSd1234", "asd1223", "mmm1234", "1234ASD" }; 8 9 Pattern p = Pattern.compile("[A-Z]{3}[0-9]{4}.*"); 10 11 Map<Boolean,List<String>> map = 12 Arrays.stream(userIdArray).collect(Collectors.groupingBy( 13 userId -> p.matcher(userId).matches() // ok なら true, ng なら false 14 )); 15 16 System.out.println("OKリスト---------"); 17 System.out.println(map.get(true)); 18 19 System.out.println("NGリスト---------"); 20 System.out.println(map.get(false)); 21 } 22}

投稿2024/05/09 18:19

編集2024/05/10 12:00
jimbe

総合スコア12760

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

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

hakumai

2024/05/09 23:17

ご回答ありがとうございます。問題点も説明してくださり、また試したところ解決いたしました。 ベストアンサーに選ばせていただきました。
jimbe

2024/05/10 12:00

お疲れさまでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問