我是使用正则表达式的初学者,我有String1= "DELIVERY 'text1' 'text2'"
和string2="DELIVERY 'text1'"
这样的字符串,我想提取"text1"
。我试过这种模式
Pattern p = Pattern.compile("^DELIVERY\\s'(.*)'");
Matcher m2 = p.matcher(string);
if (m2.find()) {
System.out.println(m2.group(1));
}
结果是:第一个字符串为text1' 'text2
,第二个字符串为text1
我也试过这个
Pattern p = Pattern.compile("^DELIVERY\\s'(.*)'\\s'(.*)'");
Matcher m2 = p.matcher(string);
if (m2.find()) {
System.out.println(m2.group(1));
}
它仅为String1
返回结果答案 0 :(得分:5)
你的第一次尝试几乎是正确的。只需替换:
.*
使用:
.*?
这使得操作员“非贪婪”,因此它将“吞没”尽可能少的匹配文本。
答案 1 :(得分:1)
你的正则表达式.*
是“贪婪的”,消耗尽可能多的输入但仍然匹配,所以它将消耗从第一个到最后一个引用的所有内容。
而是使用 relictant 版本,将?
即.*?
添加到尽可能少的服装但仍然匹配,这不会跳过引用。
将此更改与某些java功夫相结合,您可以在一行中完成所有操作:
String quoted = str.replaceAll(".*DELIVERY\\s'(.*?)'.*", "$1");
答案 2 :(得分:0)
如果您只想拥有'text1'
,请尝试使用此正则表达式:
"DELIVERY '([^']*)"
或没有分组:
"(?<=DELIVERY ')[^']*"