2

「:」(ない場合があります) と「@」の間の文字列からコンテンツを取得し、順序を保証するプログラムを作成します。 、または「123@my.com」の場合、「123」も取得します。だから私はそれを実装するために正規表現を書きますが、私は動作できません.最初のバージョンの背後にあります:

Pattern pattern = Pattern.compile("(?<=:?).*?(?=@)");
Matcher matcher = pattern.matcher("sip:+8610086@dmcw.com");
if (matcher.find()) {
     Log.d("regex", matcher.group());
} else {
     Log.d("regex", "not match");
}

最初のケース: "url:123@my.com" では結果が得られるため、機能しません: "url:123" 明らかに私が望むものではありません:

だから私は2番目のバージョンを書きます:

Pattern pattern = Pattern.compile("(?<=:??).*?(?=@)");

しかし、エラーが発生します。誰かが、Java は後読みで可変長をサポートしていないと言いました。

だから私は3番目のバージョンを試します:

Pattern pattern = Pattern.compile("(?<=:).*?(?=@)|.*?(?=@)");

その結果は最初のバージョンと同じですが、最初の条件を最初に考慮すべきではありませんか?

と同じ

Pattern pattern = Pattern.compile(".*?(?=@)|(?<=:).*?(?=@)");

左から右ではありません!以前は正規表現を理解していたと思いますが、再び混乱しました。とにかく事前に感謝します。

4

3 に答える 3

1

これを試してください(少し編集、コメントを参照):

String test = "sip:+8610086@dmcw.com";
String test2 = "8610086@dmcw.com";
Pattern pattern = Pattern.compile("(.+?:)?(.+?)(?=@)");
Matcher matcher = pattern.matcher(test);
if (matcher.find()) {
    System.out.println(matcher.group(2));
}
matcher = pattern.matcher(test2);
if (matcher.find()) {
    System.out.println(matcher.group(2));
}

出力:

+8610086
8610086

パターンの説明が必要な場合はお知らせください。

于 2013-05-29T08:45:36.690 に答える
0

あなたが言ったように、Java で変数の後読みを行うことはできません。

次に、このようなことを行うことができます。後読みや後読みは必要ありません。

正規表現::?([^@:]*)@

この例 (\n は忘れてください。これは regex101 のためです) では、最初のグループで必要なものが得られ、特別なことをする必要はありません。場合によっては、最も簡単なソリューションが最適です。

于 2013-05-29T08:46:50.460 に答える
0

ここでは、先読みや後読みはまったく必要ありません。必要なことは、貪欲な数量詞といくつかの代替を使用して達成できます。

    .*(?:^|:)([^@]+)

デフォルトでは、Java 正規表現量指定子 ( *+{n}?) はすべて貪欲です (一致が見つからなくなるまで、できるだけ多くの文字に一致します。次のように、量指定子の後に疑問符を使用することで遅延させることができます。.*?

この式のキャプチャ グループ 1 を出力する必要があります。キャプチャ グループ 0 を出力すると、一致全体が返されます。

于 2013-05-29T08:47:37.383 に答える