регулярное выражение извлекает строку между двумя символами

Я хотел бы извлечь строки между следующими символами в данной строке, используя регулярное выражение в Java:

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

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

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

Я использую приведенный выше фрагмент кода, он не может извлечь строки, которые я хочу. Я делаю что-то не так? Между тем, я совершенно новичок в регулярных выражениях.


person ssk    schedule 23.05.2012    source источник


Ответы (2)


matches() пытается сопоставить регулярное выражение со всей строкой. Если вы хотите сопоставить часть строки, вам нужен find():

if (matcher.find())

Однако вы можете создать одно регулярное выражение для одновременного соответствия всем трем частям:

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

person mellamokb    schedule 23.05.2012

Если ваш ввод всегда выглядит так, и вам всегда нужны одни и те же части, вы можете поместить это в одно регулярное выражение (с несколькими группами захвата):

"([^"]+)" <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);
}
person Joey    schedule 23.05.2012
comment
+1 Хотя вам нужны Pattern.compile и String (верхний регистр S): ideone.com/zyNVn. Вероятно, описка CSharpian :) - person mellamokb; 23.05.2012
comment
Это также привело к вашему коду. И да, C# мне немного ближе, чем Java ;) - person Joey; 23.05.2012