1

我是使用正则表达式的初学者,我有类似String1= "DELIVERY 'text1' 'text2'"and的字符串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 的结果

4

3 回答 3

5

你的第一次尝试几乎是正确的。只需更换:

.*

和:

.*?

这使操作员“不贪婪”,因此它将“吞下”尽可能少的匹配文本。

于 2013-07-03T13:29:42.897 回答
1

您的正则表达式.*是“贪婪的”,并且消耗尽可能多的输入但仍然匹配,因此它将消耗从第一个报价到最后一个报价的所有内容。

取而代之的是通过添加, 即尽可能少地但仍然匹配的服装来使用残留版本,这不会跳过任何报价。?.*?

将此更改与一些 java Kung Fu 结合起来,您可以在一行中完成所有操作:

String quoted = str.replaceAll(".*DELIVERY\\s'(.*?)'.*", "$1");
于 2013-07-03T13:44:35.783 回答
0

如果你只想拥有'text1',试试这个正则表达式:

"DELIVERY '([^']*)"

或不分组:

"(?<=DELIVERY ')[^']*"
于 2013-07-03T13:30:00.340 回答