【问题标题】:Extracting two strings from quotations in Java using regex?使用正则表达式从Java中的引号中提取两个字符串?
【发布时间】:2011-03-12 15:52:47
【问题描述】:

我是使用模式的新手,我在互联网上到处寻找这个问题的解释。

假设我有一个字符串:String info = "Data I need to extract is 'here' and 'also here'";

我将如何提取单词:

here
also here

没有使用单引号的模式?

这就是我目前所拥有的......

Pattern p = Pattern.compile("(?<=\').*(?=\')");

但它返回(here and 'also here)减去括号,这只是为了查看。它跳过了第二条数据,直接跳到最后一个引用...

谢谢!

编辑:

谢谢大家的回复!怎么可能改变模式,以便 here 存储在 matcher.group(1) 中,而 also here 存储在 matcher.group(2) 中?我出于不同的原因需要这些值,将它们从 1 组中拆分出来似乎效率低下...

【问题讨论】:

    标签: java regex extract


    【解决方案1】:

    尝试让你的正则表达式不贪婪:

    Pattern p = Pattern.compile("(?<=')(.*?)(?=')");
    

    编辑:

    这不起作用。它给出了以下匹配项:

    here
     and 
    also here
    

    这是因为前瞻/后瞻不消耗'

    要解决这个问题,请使用正则表达式:

    Pattern p = Pattern.compile("'(.*?)'");
    

    甚至更好(更快):

    Pattern p = Pattern.compile("'([^']*)'");
    

    【讨论】:

    • 此方法是否会返回匹配器中的两个组,我可以通过 matcher.group(1) 和 matcher.group(2) 访问?
    • @user656710:您原来的正则表达式没有任何组。我已将.*? 放在() 中,所以这两个词都可以在组(1)中找到。
    • 太棒了。非常感谢你的回复。作为旁注,这将如何实现,以便将单词存储在两个单独的组中?
    【解决方案2】:

    我觉得你把它弄复杂了,试试

    Pattern.compile("'([^']+)'");
    

    Pattern.compile("'(.*?)'");
    

    它们都可以工作。然后您可以在执行matcher.find() 后从第一组matcher.group(1) 中提取结果。

    【讨论】:

    • 有没有办法把结果分成matcher.group(1)和matcher.group(2)?
    • @user656710,是的,使用'([^']+)'.*?'([^']+)'
    • 工作就像一个魅力!非常感谢!
    【解决方案3】:

    这应该适合你:

        Pattern p = Pattern.compile("'([\\w\\s]+)'");
        String info = "Data I need to extract is 'here' and 'also here'";
        Matcher m = p.matcher(info);
        while (m.find()) {
            System.out.println(m.group(1));
        }
    

    这是打印输出:-

    here
    also here
    

    如果您希望将数据分成 2 个单独的组,您可以执行以下操作:-

        Pattern p = Pattern.compile("^[\\w\\s]*?'([\\w\\s]+)'[\\w\\s]*?'([\\w\\s]+)'$");
        String info = "Data I need to extract is 'here' and 'also here'";
        Matcher m = p.matcher(info);
        while (m.find()) {
            System.out.println("Group 1: " + m.group(1));
            System.out.println("Group 2: " + m.group(2));
        }
    

    这是打印输出:

    Group 1: here
    Group 2: also here
    

    【讨论】:

    • 这看起来不错...如何将这两条数据分成不同的组?
    • 我不知道为什么,但似乎模式编译不正确......我没有得到任何发现/结果:(
    • 我很确定这行得通,因为我在我的 IDE 中运行了该代码。
    【解决方案4】:

    为什么不简单地使用以下内容?

    '.*?'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 2015-12-27
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      相关资源
      最近更新 更多