[解決済み] Java Regex Capturing Groups
質問
私はこのコードブロックを理解しようとしています。最初のものでは、式で何を探しているのでしょうか?
私の理解では、任意の文字(0回以上*)の後に0から9までの任意の数字(1回以上+)が続き、その後に任意の文字(0回以上*)が続くということです。
これを実行すると、結果は
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
どなたか一緒に見ていただけませんか?
Capturingグループを使用する利点は何ですか?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTut3 {
public static void main(String args[]) {
String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d+)(.*)";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find()) {
System.out.println("Found value: " + m.group(0));
System.out.println("Found value: " + m.group(1));
System.out.println("Found value: " + m.group(2));
} else {
System.out.println("NO MATCH");
}
}
}
解決方法は?
あなたが抱えている問題は、量詞の種類にあります。あなたが使っているのは
欲張り
の量詞は、最初のグループ(インデックス
1
- インデックス0は全体を表す
Pattern
であるため)、できる限り一致させるということです。
任意の
文字にマッチします。
何文字でも
の条件を満たすように、次のグループの条件を満たすように)。
要するに、第1グループ
.*
が次のグループである限り、何でもマッチします。
\\d+
は何か(この場合は最後の桁)にマッチすることができます。
3番目のグループのように、最後の一桁以降にマッチします。
に変更すると 渋い の量詞を1番目のグループに入れると、あなたが期待しているような結果、すなわち 3000 の部分です。
に注意してください。 クエスチョンマーク を1グループ目にしています。
String line = "This order was placed for QT3000! OK?";
Pattern pattern = Pattern.compile("(.*?)(\\d+)(.*)");
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
System.out.println("group 1: " + matcher.group(1));
System.out.println("group 2: " + matcher.group(2));
System.out.println("group 3: " + matcher.group(3));
}
出力します。
group 1: This order was placed for QT
group 2: 3000
group 3: ! OK?
Javaに関する詳細情報
Pattern
こちら
.
最後に、キャプチャグループは丸括弧で区切られ、後方参照を使用するのに非常に便利な方法です。
Pattern
を入力にマッチングさせる。
Java 6ではグループは順番でしか参照できません(ネストしたグループと微妙な順番に注意)。
Java 7では、名前付きグループを使えるので、もっと簡単です。
関連
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
javaでよく使われる英単語
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] 正規表現における非捕捉グループとは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
IllegalArgumentException この例外を解決する方法
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
javaで非静的な解を静的な参照にすることができない
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
Java(1)仕上げの基本概念+eclipseのインストール構成