我有一个大文本文件,我想删除之间的所有内容 双花括号。 所以给出以下文字:
String text = "This is {{\n" +
"{{the multiline\n" +
"text}} file }}\n" +
"what I\n" +
"{{ to {{be\n" +
"changed}}\n" +
"}} want.";
String cleanedText = Pattern.compile("(?<=\\{\\{).*?\\}\\}", Pattern.DOTALL).matcher(text).replaceAll("");
System.out.println(cleanedText);
我希望输出为:
This is what I want.
我已经搜索了很多不同的东西,但我找不到任何接近我的情况的东西,一旦我改变它,一切都会变得更糟。
提前致谢
答案 0 :(得分:2)
您可以使用:
public static void main(String[] args) {
String text = "This is {{\n" +
"{{the multiline\n" +
"text}} file }}\n" +
"what I\n" +
"{{ to {{be\n" +
"changed}}\n" +
"}} want.";
String cleanedText = text.replaceAll("\\n", "");
while (cleanedText.contains("{{") && cleanedText.contains("}}")) {
cleanedText = cleanedText.replaceAll("\\{\\{[a-zA-Z\\s]*\\}\\}", "");
}
System.out.println(cleanedText);
}
答案 1 :(得分:1)
正则表达式不能表达任意嵌套的结构;即任何需要递归语法来描述的语法。
如果要使用Java Pattern解决此问题,则需要通过重复模式匹配来实现。这是一个解决方案:
String res = input;
while (true) {
String tmp = res.replaceAll("\\{\\{[^}]*\\}\\}", "");
if (tmp.equals(res)) {
break;
}
res = tmp;
}
这不是很有效......
可以将其转换为等效但更简洁的形式:
String res = input;
String tmp;
while (!(tmp = res.replaceAll("\\{\\{[^}]*\\}\\}", "")).equals(res)) {
res = tmp;
}
...但我更喜欢第一个版本,因为它(IMO)更具可读性。
答案 2 :(得分:0)
我不是正则表达式的专家,所以我只写一个循环来为你做这个。如果您没有/想要使用regEx,那么它对您有帮助;)
public static void main(String args[]) {
String text = "This is {{\n" +
"{{the multiline\n" +
"text}} file }}\n" +
"what I\n" +
"{{ to {{be\n" +
"changed}}\n" +
"}} want.";
int openBrackets = 0;
String output = "";
char[] input = text.toCharArray();
for(int i=0;i<input.length;i++){
if(input[i] == '{'){
openBrackets++;
continue;
}
if(input[i] == '}'){
openBrackets--;
continue;
}
if(openBrackets==0){
output += input[i];
}
}
System.out.println(output);
}
答案 3 :(得分:0)
My suggestion是删除大括号之间的任何内容,从最里面的一对开始:
String text = "This is {{\n" +
"{{the multiline\n" +
"text}} file }}\n" +
"what I\n" +
"{{ to {{be\n" +
"changed}}\n" +
"}} want.";
Pattern p = Pattern.compile("\\{\\{[^{}]+?}}", Pattern.MULTILINE);
while (p.matcher(text).find()) {
text = p.matcher(text).replaceAll("");
}
产生输出
This is
what I
want.
当使用单个花括号或不成对的括号时,这可能会失败,但对于您的情况可能已经足够了。