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如果它解决了你的问题,你可以接受解决方案:)