Java-正则表达式,只要包含特定字符串,就可以删除方括号之间的内容

Java-正则表达式,只要包含特定字符串,就可以删除方括号之间的内容,java,regex,Java,Regex,我有一句话: String sentence = "FirstName LastName (pronounced as: X) (born 1 June 1900)"; 我需要正则表达式,只要括号之间的文本包含单词:发音,它就可以去掉括号(包括括号)之间的所有内容 产生如下输出: "FirstName LastName (born 1 June 1900)" 请让我知道如何。。。谢谢。您可以尝试以下正则表达式: (?=\\([^()]*?pronounced)\\([^)]+\\) 和一个

我有一句话:

String sentence = "FirstName LastName (pronounced as: X) (born 1 June 1900)";
我需要正则表达式,只要括号之间的文本包含单词:发音,它就可以去掉括号(包括括号)之间的所有内容

产生如下输出:

"FirstName LastName (born 1 June 1900)"

请让我知道如何。。。谢谢。

您可以尝试以下正则表达式:

(?=\\([^()]*?pronounced)\\([^)]+\\)
和一个空的替换字符串

Java代码:

String input = "FirstName LastName (pronounced as: X) (born 1 June 1900)";
String result = input.replaceAll("(?=\\([^()]*?pronounced)\\([^)]+\\)", "");

这样的模式应该可以工作:

\((?=[^)]*pronounced)[^)]+\)
这将匹配文字
后接一个或多个字符,而不是
后接文字
,但前提是它还包含发音为
的文字

不要忘记用Java字符串文字转义
\

output = input.replaceAll("\\((?=[^)]*pronounced)[^)]+\\)", "");

无需前瞻,否定字符类完成以下任务:

/\([^)]*pronounced[^)]*\)/

那些不是括号
{}
。那些是括号,对我们来说,
{}
@pguardiario-@DaoWen,是括号。坚持下去,你会学到一些东西。@pguardiario-好吧,你最好告诉编写Java语言规范的人,因为显然“块是一系列语句、局部类声明和局部变量声明,放在大括号内。”此外,我想提出的最初观点是,StackOverflow是一个国际社会,我们应该熟悉一些非美国英语术语。(是的,我注意到你的个人资料上说你来自菲律宾。)不错,但前瞻是不必要的。很好,效果很好。它将如何与嵌套一起工作。。。有时,我的文本可能有如下内容:String input=“FirstName LastName((发音为:X)(生于1900年6月1日))”。在这种情况下,我需要保留(生于1900年6月1日)。你能帮忙吗?@jjj使用当前的表达式这将给你留下
FirstName LastName(生于1900年6月1日))
。您希望实际输出结果如何?@jjj我对我的答案做了一点修改,请检查编辑。@Sniffer-您的第一个正则表达式
(?=\\(.*?发音)\\([^]+\\)
匹配'
(不匹配)
(发音应匹配)'。第二个更好。@sln你说得对。谢谢你的观察。我将删除第一个表达式……如果您只需要最里面的一组可能嵌套的括号,则仍然不需要lookaheads:
\([^()]*发音[^()]*\)
。为什么其他人都那么拘泥于外表?只是好奇,这个
/\([^)]*?发音[^]*\)/
能减少回溯吗?@Alan Moore-我认为当人们理解这些断言时,它们往往会被人们过度使用。这可能是额外的处理。如果
发音的
总是看起来更接近开头
而不是结尾
,那么不情愿的
*?
可能会产生明显的不同。但总的来说,我认为将
[^]*
的两个实例都更改为
[^()]*
将在性能方面做得更好,因为这将导致在不可能匹配时更快失败。
/\([^)]*pronounced[^)]*\)/