用正则表达式替换Java中大括号{}之间的所有文本
我有一个长字符串,在{}之间出现了许多文本,我希望在执行此操作时将其删除:用正则表达式替换Java中大括号{}之间的所有文本,java,regex,string,Java,Regex,String,我有一个长字符串,在{}之间出现了许多文本,我希望在执行此操作时将其删除: data = data.replaceAll("{(.*?)}", ""); 我遇到了一个错误,那么我做错了什么/我应该怎么做呢?您需要跳出大括号,因为它表示正则表达式中量词-{n}的开头。而且你并不真的需要捕获组,所以删除它 data = data.replaceAll("\\{.*?}", ""); 一般来说,这是一项不适合regex的工作。通常,如果“{text}”是可能的,那么“{text1}{text2}”
data = data.replaceAll("{(.*?)}", "");
我遇到了一个错误,那么我做错了什么/我应该怎么做呢?您需要跳出大括号,因为它表示正则表达式中量词-
{n}
的开头。而且你并不真的需要捕获组,所以删除它
data = data.replaceAll("\\{.*?}", "");
一般来说,这是一项不适合regex的工作。通常,如果“{text}”是可能的,那么“{text1}{text2}”也是可能的,它不能用正则表达式正确解析
这也是为什么XML/HTML解析器不使用正则表达式的原因。试试这个,也许这会对您有所帮助
String refinedData = new String(data);
Pattern p = Pattern.compile("\\{[^\\}]*\\}");
Matcher m = p.matcher(data);
while(m.find()){
String d = data.substring(m.start(), m.end());
refinedData = refinedData.replace(d, "");
}
这将替换花括号之间的所有文本,并保留括号 这是通过积极的前瞻和积极的后顾来实现的
data = data.replaceAll("(?<=\\{).*?(?=\\})", "");
“if(true){calc();}”变为“if(true)”
这将替换花括号中的所有文本,包括新行
data = Pattern.compile("(?<=\\{).*?(?=\\})", Pattern.DOTALL).matcher(data).replaceAll("");
data=Pattern.compile((?当您需要将一个子字符串从一个字符匹配到另一个字符时,最好的正则表达式解决方案是使用分隔符,并在它们之间插入一个与除分隔符字符以外的任何字符相匹配的字符串
因此,基本伪模式是
a [^ ab ]* b
其中:
a
-起始分隔符
[^ab]*
-除a
和b
b
-尾随分隔符
因此,要替换{
和}
(大括号之间)之间的所有文本,请使用
String data = "text 1 {\ntext 2\ntext 3\n}";
System.out.println(data.replaceAll("\\{[^{}]*}", ""));
// => text 1
见
请注意,在Java正则表达式中,{
和}
不必在字符类内部转义,而且}
甚至不必在字符类外部转义。只能转义(或放入字符类)字符类外部的{
为了避免形成限制量词结构。这是一个在使用正则表达式之前测试正则表达式的好地方。尝试了这一点,除了{}之间的文本之外,没有错误未被删除。@Jister13.是否有嵌套的大括号?@Jister13.对于该字符串,它肯定会起作用。中间是否有换行符?不,它只是将所有内容都保留在那里。@Jister13.就您的字符串所示,这会起作用。如果在{
及其后。这意味着,如果您的代码缩进,那么这将不起作用。此外,对于任何复杂字符串,它可能会变得更难看。您最好编写自己的解析器。那么我该怎么做呢?不使用正则表达式?这完全取决于您想要什么。如果您想要在没有嵌套大括号的文本中输入,那么t如果你只想去掉最外面的大括号,(也就是说,{{text1}{text2}}将变成“”)然后它也可以工作。但是一旦你想解析更大的文本,并且你想在每对大括号嵌套时对它们进行一些转换,它就不起作用了。用循环手动解析,用计数器跟踪开大括号和闭大括号在这种情况下是合适的。我只想删除大括号中任何大括号之间的所有文本tring@Jister13然后rohain答案中的正则表达式就可以了。也许可以将*?
更改为*
,使其更贪婪,并消耗所有东西,而不仅仅是第一个右括号。不,因为这将把“a{b}c{d}e”变成“a e”。如果没有嵌套,可以使用“\{[^}]*},但这确实需要一个解析器。不,不要这样做。如果正则表达式匹配它应该匹配的内容,它将在OP的代码中工作(即data=data.replaceAll(“\\{[^\}]*\\},”;
)。在while(matcher.find())中执行replace()
,这是没有意义的
loop.@alanmore除非您希望根据匹配的值添加某些条件(例如,用字符替换十六进制值,(0x20)
用空格)。
String data = "text 1 {\ntext 2\ntext 3\n}";
System.out.println(data.replaceAll("\\{[^{}]*}", ""));
// => text 1