我有一个很长的字符串,{}之间有很多文字出现,我想删除但是当我这样做时:
data = data.replaceAll("{(.*?)}", "");
我收到错误,所以我做错了什么/我应该怎么做呢?
答案 0 :(得分:7)
这将替换大括号之间的所有文本并保留括号 这是通过积极向前看和积极展望
来完成的data = data.replaceAll("(?<=\\{).*?(?=\\})", "");
“if(true){calc();}”变为“if(true){}”
这将替换花括号之间的所有文本并删除括号
data = data.replaceAll("\\{.*?\\}", "");
“if(true){calc();}”变为“if(true)”
这将替换大括号之间的所有文本,包括新行。
data = Pattern.compile("(?<=\\{).*?(?=\\})", Pattern.DOTALL).matcher(data).replaceAll("");
“if(true){\ n \ t \ t \ t \ tcalc(); \ n}”变为“if(true){}”
答案 1 :(得分:5)
你需要转义左括号,因为它表示量词的开始 - {n}
在正则表达式中。并且您并不真正需要捕获组,因此请将其删除。
data = data.replaceAll("\\{.*?}", "");
答案 2 :(得分:1)
一般来说,这是一项不适合正则表达式开始的工作。通常,如果“{text}”是可能的,那么“{{text1} {text2}}”无法使用正则表达式进行正确解析。
这与XML / HTML解析器不使用正则表达式
的原因相同答案 3 :(得分:1)
试试这个,这可能会对你有帮助。
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, "");
}
答案 4 :(得分:0)
当您需要将单个字符中的子字符串与另一个单个字符匹配时,最好的正则表达式解决方案是使用分隔符并在它们之间插入negated character class匹配除分隔符之外的任何字符。
因此,基本伪模式是
a [^ ab ]* b
其中:
a
- 起始分隔符[^ab]*
- 除a
和b
以外的零个或多个字符b
- 尾随分隔符。所以,替换{
和}
之间(大括号之间)的所有文字,请使用
String data = "text 1 {\ntext 2\ntext 3\n}";
System.out.println(data.replaceAll("\\{[^{}]*}", ""));
// => text 1
请参阅IDEONE demo
请注意,在Java正则表达式中,{
和}
不必在字符类中进行转义,并且}
不必在其外部进行转义。只有字符类之外的{
必须被转义(或放入字符类),以免形成限制量词构造。