使用正则表达式从Java中的引号中提取两个字符串?

时间:2011-03-12 15:52:48

标签: java regex extract

我是新手使用模式,并在互联网上随处可见,以解释此问题。

说我有一个字符串: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)中,而也在这里存储在matcher.group(2)中?我出于不同的原因需要这些值,并将它们从1组中分离出来似乎效率低下......

4 个答案:

答案 0 :(得分:3)

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

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

编辑:

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

here
 and 
also here

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

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

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

甚至更好(和更快):

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

答案 1 :(得分:1)

我认为你要复杂化,试试

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

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

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

答案 2 :(得分:1)

这应该适合你:

    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

答案 3 :(得分:0)

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

'.*?'