我是新手使用模式,并在互联网上随处可见,以解释此问题。
说我有一个字符串: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组中分离出来似乎效率低下......
答案 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)
为什么不简单地使用以下内容?
'.*?'