我想使用Java中的regex在给定字符串中提取以下字符之间的字符串:
/*
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);
}
我使用上面给出的代码片段,它无法提取我想要的字符串。我做错了吗?与此同时,我对正则表达式还很陌生。
答案 0 :(得分: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);
}
答案 1 :(得分: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);
}