[解決済み] 正規表現にマッチした配列の作成
2022-04-20 17:11:36
質問
Javaで、正規表現にマッチしたものをすべて配列に返そうとしているのですが、パターンが何かにマッチするかどうか(ブール値)しかチェックできないようです。
与えられた文字列の中で正規表現にマッチするすべての文字列の配列を形成するために、正規表現マッチをどのように使用できますか?
どのように解決するのですか?
( 4castleの回答 は、Javaを>=9と仮定すれば、下記より良い)
matcherを作成し、それを使って繰り返しマッチを見つける必要があります。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
...
List<String> allMatches = new ArrayList<String>();
Matcher m = Pattern.compile("your regular expression here")
.matcher(yourStringHere);
while (m.find()) {
allMatches.add(m.group());
}
この後
allMatches
にはマッチが含まれており
allMatches.toArray(new String[0])
を使うと、本当に必要な場合は配列を得ることができます。
を使用することもできます。
MatchResult
を使用して、マッチをループするためのヘルパー関数を記述します。
から
Matcher.toMatchResult()
は、現在のグループの状態のスナップショットを返します。
例えば、遅延イテレータを書けば、次のようなことができます。
for (MatchResult match : allMatches(pattern, input)) {
// Use match, and maybe break without doing the work to find all possible matches.
}
というようにすることで
public static Iterable<MatchResult> allMatches(
final Pattern p, final CharSequence input) {
return new Iterable<MatchResult>() {
public Iterator<MatchResult> iterator() {
return new Iterator<MatchResult>() {
// Use a matcher internally.
final Matcher matcher = p.matcher(input);
// Keep a match around that supports any interleaving of hasNext/next calls.
MatchResult pending;
public boolean hasNext() {
// Lazily fill pending, and avoid calling find() multiple times if the
// clients call hasNext() repeatedly before sampling via next().
if (pending == null && matcher.find()) {
pending = matcher.toMatchResult();
}
return pending != null;
}
public MatchResult next() {
// Fill pending if necessary (as when clients call next() without
// checking hasNext()), throw if not possible.
if (!hasNext()) { throw new NoSuchElementException(); }
// Consume pending so next call to hasNext() does a find().
MatchResult next = pending;
pending = null;
return next;
}
/** Required to satisfy the interface, but unsupported. */
public void remove() { throw new UnsupportedOperationException(); }
};
}
};
}
これを使って
for (MatchResult match : allMatches(Pattern.compile("[abc]"), "abracadabra")) {
System.out.println(match.group() + " at " + match.start());
}
イールド
a at 0 b at 1 a at 3 c at 4 a at 5 a at 7 b at 8 a at 10
関連
-
[解決済み] 正規表現で変数を使うには?
-
IDEA パッケージステートメントの欠落
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] JavaScriptの正規表現でマッチしたグループにアクセスするにはどうすればよいですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] JSで文字列が正規表現にマッチするかどうかをチェックする
-
[解決済み] 正規表現で「この文字列までなら何でもあり」にマッチさせるには?
-
[解決済み] Microsoft Excelで正規表現(Regex)をセル内とループの両方で使用する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
jd-gui Java Exceptionが発生しました。
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
プロローグでのコンテンツは禁止されています
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
自動配線された依存性のインジェクションに失敗しました。
-
javaでよく使われる英単語
-
テストが見つかりませんでした