2012-05-23 1 views
2

Я хотел бы, чтобы извлечь строки между следующими символами в данной строке с помощью регулярных выражений в 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); 
} 

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

ответ

4

Метод 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); 
} 

Demo : http://ideone.com/8t2EC

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); 
} 
+0

+1 Хотя вам нужно '' Pattern.compile' и String' (заглавную 'S'): http://ideone.com/zyNVn. Вероятно, CSharpian slip :) – mellamokb

+0

Это привело к тому, что у вас был очень хороший код. И да, C# немного ближе ко мне, чем Java;) – Joey