1

私はテキストを持っており、second の後に文字列を抽出する正規表現を書きたいと思います@。例: @ some text with letter, digit 123 1234 and symbols {[ @text_to_extract. second の後の文字列のみを抽出する正規表現をどのように記述すればよいでしょうか@。このコードは正しい方向への一歩のようです:

Pattern p = Pattern.compile("@@(.+?)");
Matcher m = p.matcher("asdasdas@@textToExtract");

これは間のテキスト@が空の場合に機能しますが、正規表現でテキストを指定するにはどうすればよいですか?

Pattern.compile("@(*)@(.+?)");?

編集済み:
もう 1 つの条件です。テキストは と の間@にある場合がありますが、そうである@必要はありません。

4

3 に答える 3

4
  • 最初のグループをキャプチャしないでください
  • プレーン*を に変更し.*ます。
  • 2 番目のワイルドカードを貪欲にします。それ以外の場合は 1 文字だけをキャプチャします

Pattern.compile("@.*@(.+)");
于 2013-10-31T14:55:49.047 に答える
1

「貪欲でない」演算子は削除する必要があります。 (.*?)...である必要があり(.*)ます。それ以外の場合は、2 番目の @ の後のテキストの最小値のみに一致します。必ず「.」が必要です。*の前に。これは、「先行する文字が 0 個以上あることを意味します。実際には、代わりに .. を使用したいかもしれません[^@]*... アットマーク以外のものと一致します.. . が改行と一致しなくても、すべてを取得することが保証されます。とにかく、これが作業コードです。

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.*;

class Ideone {
    public static void main(String[] args) throws java.lang.Exception {
        // Pattern p = Pattern.compile("@(*)@(.+?)");
        Pattern p = Pattern.compile("@.*@(.+)");
        Matcher m = p.matcher("asdasdas@@textToExtract");

        while (m.find()) {
            System.out.println(m.group(1));
        }
    }
}

ここのコードで遊んでください: http://ideone.com/rxB5Zy

于 2013-10-31T15:03:22.450 に答える
0

こうすればいい

Matcher m =Pattern.compile("^[^@]*@[^@]*@([^@]*)").matcher(input);
于 2013-10-31T14:58:57.757 に答える