Java 用正则表达式提取字符串

Java 用正则表达式提取字符串,java,regex,Java,Regex,我是一个使用正则表达式的初学者,我有像String1=“DELIVERY'text1”“text2'”和string2=“DELIVERY'text1'”,我想提取“text1”。我试过这个模式 Pattern p = Pattern.compile("^DELIVERY\\s'(.*)'"); Matcher m2 = p.matcher(string); if (m2.find()) { System.out.p

我是一个使用正则表达式的初学者,我有像
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的结果

您的第一次尝试几乎正确。只需替换:

.*
与:


这使得操作符“非贪婪”,因此它将“吞咽”尽可能少的匹配文本。

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

.*
与:


这使得操作符“非贪婪”,因此它将“吞掉”尽可能少的匹配文本。

如果您只想拥有
'text1'
,请尝试以下正则表达式:

"DELIVERY '([^']*)"
或不分组:

"(?<=DELIVERY ')[^']*"

(?如果您只想使用
'text1'
,请尝试以下正则表达式:

"DELIVERY '([^']*)"
或不分组:

"(?<=DELIVERY ')[^']*"

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

相反,使用relictant版本,添加
,即
*?
到服装中,尽可能少,但仍然匹配,这不会跳过报价

将这一变化与一些java功夫结合起来,您可以在一行中完成这一切:

String quoted = str.replaceAll(".*DELIVERY\\s'(.*?)'.*", "$1");

您的regex
*
是“贪婪”的,它消耗尽可能多的输入,但仍然匹配,因此它将消耗从第一个到最后一个引号的所有内容

相反,使用relictant版本,添加
,即
*?
到服装中,尽可能少,但仍然匹配,这不会跳过报价

将这一变化与一些java功夫结合起来,您可以在一行中完成这一切:

String quoted = str.replaceAll(".*DELIVERY\\s'(.*?)'.*", "$1");

虽然它在本例中有效,但我不建议使用这样的文本空间。类似“\s+”的东西几乎总是更好,因为它涵盖了多个空格或制表符等可能性。@TomLord你是对的。我只是复制了字符串。我认为这不是问题的重点。无论如何,你是对的。虽然在本例中它有效,但我不建议使用像“\s+”这样的文字空格几乎总是更好,因为它涵盖了多个空格或制表符。@TomLord你是对的。我只是复制了字符串。我认为这不是问题的重点。无论如何,你是对的。@Mikou如果它解决了你的问题,你可以接受解决方案:)@Mikou如果它解决了你的问题,你可以接受解决方案:)