使用Regex模式替换文本块(在java中)

时间:2017-04-08 13:19:08

标签: java regex

我正在尝试使用正则表达式从文件中删除一个文本块。 现在我将文件的内容放在一个String中,但Matcher找不到该模式。 示例文件是:

\begin{comment}
this block should be removed
i.e. it need to be replaced
\end{comment}
this block should remains.
\begin{comment}
this should be removed too.
\end{comment}

我需要找到以\begin{comment}开头并以\end{comment}结尾的块,然后将其删除。 这是我使用的最小代码。我正在使用的正则表达式是\\begin\{.*?\\end\{comment\},应该找到并以'\ begin'开头的模式,直到第一次出现'\ end {comment}'。我在Notepad ++工作。

然而,使用这个java代码,它会找到第一个'\ begin'和最后'\ end'行并删除它们之间的所有内容。我想保留块中的行。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class main {
    public static void main(String[] args) {
        String output;
        String s =  "\\begin{comment}\n"+
        "this block should be removed\n"+
        "i.e. it need to be replaced\n"+
        "\\end{comment}\n"+
        "this block should remains.\n"+
        "\\begin{comment}\n"+
        "this should be removed too.\n"+
        "\\end{comment}";
        Matcher m = Pattern.compile("\\\\begin\\{comment(?s).*\\\\end\\{comm.*?\\}").matcher(s);
        while(m.find())
        {
            System.out.println(m.group(0));
            output = m.replaceAll("");
        }

        m = Pattern.compile("\\begin").matcher(s);
        while(m.find())
        {
            System.out.println(m.group(0));
            output = m.replaceAll("");
        }
    }
}

更新:

我使用this在线工具来查找它。         Matcher m = Pattern.compile(“\\ begin \ {comment(?s)。 \\ end \ {comm。?\}”)。matcher(s);

1 个答案:

答案 0 :(得分:0)

您必须在2点修复您的代码:

  1. 该模式应与您的 Notepad ++ 等效,明星后跟?应该 lazy

    Matcher m = Pattern.compile("\\\\begin\\{comment}(?s).*?\\\\end\\{comment}").matcher(s);
    -------------------------------------------------------^
    
  2. 请注意,仅当不存在嵌套注释部分时,此模式才能正常工作。

    1. 后一个修复程序关注逻辑:如果你调用匹配器 replaceAll 函数,它会在执行时替换每个匹配部分(已经在第一个{{1}循环执行)。如果您需要循环来检查每个注释块,请将其替换为:

      m.find()

      或只是简单地应用output = m.replaceFirst(""); 而没有任何循环。