【问题标题】:regex extract string between two characters正则表达式提取两个字符之间的字符串
【发布时间】:2012-05-30 05:50:02
【问题描述】:

我想在 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);
}

我正在使用上面给出的代码 sn-p,它无法提取我想要的字符串。我做错什么了吗?同时,我对正则表达式还很陌生。

【问题讨论】:

    标签: java regex pattern-matching matcher


    【解决方案1】:

    如果您的输入总是这样,并且您总是希望从中得到相同的部分,您可以将其放在一个正则表达式中(具有多个捕获组):

    "([^"]+)" <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);
    }
    

    【讨论】:

    • +1 虽然你需要Pattern.compileString(大写S):ideone.com/zyNVn。可能是 CSharpian 失误:)
    • 它也产生了你的代码。是的,C# 比 Java 更接近我 ;)
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2018-11-22
      相关资源
      最近更新 更多