2

Javaで正規表現を使用して、指定された文字列の次の文字の間の文字列を抽出したいと思います:

/*
1) Between \" and \"   ===> 12222222222
2) Between :+ and @    ===> 12222222222
3) Between @ and >     ===> 192.168.140.1
*/

String remoteUriStr = "\"+12222222222\" <sip:+12222222222@192.168.140.1>";
String regex1 = "\"(.+?)\"";
String regex2 = ":+(.+?)@";
String regex3 = "@(.+?)>";

Pattern p = Pattern.compile(regex1);
Matcher matcher = p.matcher(remoteUri);
if (matcher.matches()) {
    title = matcher.group(1);
}

上記のコード スニペットを使用していますが、必要な文字列を抽出できません。私は何か間違ったことをしていますか?一方、私は正規表現にまったく慣れていません。

4

2 に答える 2

4

このmatches()メソッドは、文字列全体に対して正規表現を照合しようとします。文字列の一部を一致させたい場合は、次のfind()メソッドが必要です。

if (matcher.find())

ただし、一度に 3 つの部分すべてに一致する単一の正規表現を作成することもできます。

String regex = "\"(.+?)\" \\<sip:\\+(.+?)@(.+?)\\>";
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(remoteUriStr);
if (matcher.matches()) {
    title = matcher.group(1);
    part2 = matcher.group(2);
    ip = matcher.group(3);
}

デモ: http://ideone.com/8t2EC

于 2012-05-23T16:28:42.183 に答える
3

入力が常にそのように見え、常に同じ部分が必要な場合は、それを単一の正規表現に入れることができます (複数のキャプチャ グループを使用):

"([^"]+)" <sip:([^@]+)@([^>]+)>

だからあなたはそれを使うことができます

Pattern p = Pattern.compile("\"([^\"]+)\" <sip:([^@]+)@([^>]+)>");
Matcher m = p.matcher(remoteUri);
if (m.find()) {
  String s1 = m.group(1);
  String s2 = m.group(2);
  String s3 = m.group(3);
}
于 2012-05-23T16:30:51.763 に答える