【发布时间】:2013-10-03 18:23:48
【问题描述】:
我有一个长字符串,在 {} 之间出现了很多文本,但当我这样做时:
data = data.replaceAll("{(.*?)}", "");
我收到一个错误,那么我做错了什么/我应该怎么做?
【问题讨论】:
-
regexplanet.com/advanced/java/index.html 这是在使用正则表达式之前测试它们的好地方
我有一个长字符串,在 {} 之间出现了很多文本,但当我这样做时:
data = data.replaceAll("{(.*?)}", "");
我收到一个错误,那么我做错了什么/我应该怎么做?
【问题讨论】:
这将替换大括号之间的所有文本并保留括号 这是通过正面展望和正面展望来完成的
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\tcalc();\n }" 变为 "if (true) {}"
【讨论】:
您需要转义左大括号,因为它表示量词的开始 - 正则表达式中的{n}。而且你真的不需要那个捕获组,所以删除它。
data = data.replaceAll("\\{.*?}", "");
【讨论】:
{ 之前和之后有任何换行符。这意味着,如果您的代码是缩进的,那么这将不起作用。此外,对于任何复杂的字符串,它可能会变得更丑陋。你最好编写自己的解析器。
一般来说,这是一个不适合正则表达式的工作。通常如果 "{ 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("\\{[^\\}]*\\}", "");)。在while (matcher.find()) 循环中执行replace() 是毫无意义的。
(0x20))。
当您需要匹配从一个 单个字符 到另一个 单个 字符的子字符串时,最好的正则表达式解决方案是使用分隔符并在它们之间插入一个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
请注意,在 Java 正则表达式中,{ 和 } 不必在字符类内部转义,} 即使在其外部也不必转义。只有{字符类之外必须转义(或放入字符类),以免形成限制量词构造。
【讨论】: