我尝试过以下正则表达式:
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
你能帮到这个吗?
答案 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
答案 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", "")
);