Java正则表达式replaceall

时间:2014-10-14 13:02:59

标签: java regex replaceall

我尝试过以下正则表达式:

final String REG="\\Q[\\E((Bird)|(Animal)): .*\\Q]\\E";
System.out.println(input.replaceAll(REG," "));

将所有"[Bird:*]""[Animal:*]"替换为空白区域。

例如,给定input字符串

[Bird: Peacock] national bird [India], colorful. [Bird: Crow] crow is black [Animal: Cow] cow gives milk

实际输出是:

cow gives milk

它将[Bird:与给定字符串的最后一个]相匹配。但是,预期的结果应该是

national bird [India], colorful. crow is black cow gives milk

你能帮到这个吗?

4 个答案:

答案 0 :(得分:3)

默认情况下,

*量词是贪婪的,所以就像你注意到它会匹配从[Bird:到最后]的最大文本范围。您可以通过在其后面添加?来使其不情愿地量化,因此请尝试使用

final String REG="\\Q[\\E((Bird)|(Animal)): .*?\\Q]\\E";
//                                            ^ - make `*` reluctant

你也可以使用第二种(首选技术 - 因为回溯较少)而不是接受任何字符的.(行分隔符除外)使用零或更多 not - ] -character 喜欢(可以写成[^\\]]*),它会给你

final String REG="\\Q[\\E((Bird)|(Animal)): [^\\]]*\\Q]\\E";

BTW通过在它们之前添加[来更容易地逃避正则表达式元字符]\\。如果您想要转义可能包含许多元字符的大型文本,\\Q\\E都很不错。所以考虑将你的正则表达式重写为更短的东西

final String REG="\\[(Bird|Animal): [^\\]]*\\]";

甚至

final String REG="\\[(Bird|Animal): [^\\]]*\\]";

因为字符类之外的]实际上不是元字符。


还有一件事:考虑删除一个围绕已删除的[...]令牌的空格。这样,您就可以阻止输出从"[xx] foo [xx] bar [xx] baz"更改为" foo bar baz"

为此,您还可以在删除[ ]后删除每个空格(如果存在此类空格)。所以只需在正则表达式的末尾添加\\s?即可给你

(让我们希望)正则表达式的最终版本

final String REG="\\[(Bird|Animal): [^\\]]*]\\s?";

答案 1 :(得分:1)

.*默认情况下是贪婪的,它会尽可能地吃掉很多字符。为了让*进行非贪婪的匹配(最短匹配),您需要在?之后添加量词*。< / p>

\\Q[\\E((Bird)|(Animal)): .*?\\Q]\\E

DEMO

答案 2 :(得分:0)

使用它:

String regex = String s= "[Bird: Peacock] national bird [India], colorful. [Bird: Crow] crow is black [Animal: Cow] cow gives milk";
String regex = "\\[(Bird|Animal): [^\\]]*]";
System.out.println(s.replaceAll(regex, ""));

答案 3 :(得分:0)

你应该用一个不情愿的量词替换量词,以便不情愿地匹配下一个方括号。

另外,你不需要引用备用支架,你可以逃脱它们。

最后,您可以使用空String替换表达式而不是空格。

例如:

final String REG = "\\[((Bird)|(Animal)): .*?\\]";
final String input = "[Bird: Peacock] national bird [India], colorful. [Bird: Crow] crow is black [Animal: Cow] cow gives milk";
System.out.println(input.replaceAll(REG, ""));

输出(仍然不完美 - 以空格开头并有几个连续的空格)

 national bird [India], colorful.  crow is black  cow gives milk

完全卫生

System.out.println(
    input.replaceAll(REG, " ")
         .replaceAll("\\s+", " ")
         .replaceAll("^\\s", "")
);