正規表現の一致後に続くテキストを取得する


84

正規表現を使用するのは初めてです。チュートリアルを何度も行ってきましたが、やりたいことに当てはまるチュートリアルが見つかりません。

何かを検索したいのですが、それに続くすべてを返しますが、検索文字列自体は返しません

例:「すごいいくつかの不完全な文

」を検索する

それはすごい」を返す

どんな助けでも大歓迎です

これはこれまでの私の正規表現です

sentence(.*) 

しかし、それは戻ります:素晴らしい文

Pattern pattern = Pattern.compile("sentence(.*)");

Matcher matcher = pattern.matcher("some lame sentence that is awesome");

boolean found = false;
while (matcher.find())
{
    System.out.println("I found the text: " + matcher.group().toString());
    found = true;
}
if (!found)
{
    System.out.println("I didn't find the text");
}

あなたの実際の電話は何ですか?使用していMatcherますか?
Grzegorz Oledzki 2011

私はマッチャーとパターンを使用しています
スコット

...そして、何が問題なのかを評価するために、実際のJavaコードを確認したいと思います。
Steve Jorgensen 2011

System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
ニシャント2011

3
@DavidIsNotHereナチスは大文字のNを持つ必要があります...–
Lee Taylor

回答:


135

コメントで要求した「正規表現のみ」でこれを行うことができます。

(?<=sentence).*

(?<=sentence)ある正の後読みアサーションが。これは、文字列内の特定の位置、つまりsentence、テキスト自体を一致の一部にすることなく、テキストの直後の位置で一致します。したがって、。(?<=sentence).*以降のテキストと一致しますsentence

これは正規表現の非常に優れた機能です。ただし、Javaでは、これは有限長の部分式に対してのみ機能します。つまり(?<=sentence|word|(foo){1,4})、正当ですが、そうで(?<=sentence\s*)はありません。


あなたは、前向きな後読みアサーションを含めるべきではないと述べています。したがって、「。*(?<= sentence)」はすべてを返す必要がありますが、「sentence」は含まないと思います。しかし、そうではなく、「文」も返します。何が足りないのですか?
JJJones_3860 2018

@ user2184214:それはアサーションの背後にあるものだからです。.*任意のテキストに一致し(?<=...)てから、単語を逆方向に検索sentenceし、この場合、一致がその単語で終了することを表明します。その単語の前で停止したい場合は、を見越す必要があります:.*(?=sentence)後に続くすべてのテキストに一致しますsentence
Tim Pietzcker 2018

17

あなたの正規表現"sentence(.*)"は正しいです。括弧内のグループの内容を取得するには、次のように呼び出します。

Pattern p = Pattern.compile( "sentence(.*)" );
Matcher m = p.matcher( "some lame sentence that is awesome" );
if ( m.find() ) {
   String s = m.group(1); // " that is awesome"
}

m.find()この場合(文字列のどこかを見つけようとする)の使用に注意してくださいm.matches()(接頭辞「somelame」のために失敗します。この場合、正規表現はである必要があります".*sentence(.*)"


ありがとう、でも「それはすごい」と返して欲しいだけならどうなるか
スコット

ありがとう、これはうまくいきました。正規表現だけでこれを行う方法があることを望んでいました。その方法が見つからない場合は、これも機能します
スコット

パフォーマンスのために正規表現の最後に「(。*)」を追加するのはおそらく悪い考えです...
eregon 2011年

8

マッチャーがで初期化されている場合str、一致後、一致後にパーツを取得できます。

str.substring(matcher.end())

サンプルコード:

final String str = "Some lame sentence that is awesome";
final Matcher matcher = Pattern.compile("sentence").matcher(str);
if(matcher.find()){
    System.out.println(str.substring(matcher.end()).trim());
}

出力:

すごいです


matcher.find()この前に、IMOが必要です。
ニシャント2011

@Nishantそれは私が書いたものです:「試合後」。説明のためにサンプルコードを追加
ショーンパトリックフロイド

1

マッチャーのgroup(int)を使用する必要があります。group(0)は一致全体であり、group(1)は最初にマークしたグループです。指定した例では、group(1)は「」の後に続くものです。


1

次の行に「group()」の代わりに「group(1)」を入力するだけで、期待どおりの結果が得られます。

System.out.println("I found the text: " + matcher.group(**1**).toString());
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.