如何删除多行中括号之间的文本

时间:2017-04-05 12:50:12

标签: java regex

我有一个大文本文件,我想删除之间的所有内容  双花括号。 所以给出以下文字:

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.

我已经搜索了很多不同的东西,但我找不到任何接近我的情况的东西,一旦我改变它,一切都会变得更糟。

提前致谢

4 个答案:

答案 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.

当使用单个花括号或不成对的括号时,这可能会失败,但对于您的情况可能已经足够了。