使用 Regex 模式替换文本块(在 java 中)
Posted
技术标签:
【中文标题】使用 Regex 模式替换文本块(在 java 中)【英文标题】:Replace a block of text using a pattern of Regex (in java) 【发布时间】:2017-04-08 13:19:08 【问题描述】:我正在尝试使用正则表达式从文件中删除一段文本。
现在我在一个String
中有文件的内容,但Matcher
找不到模式。
示例文件为:
\begincomment
this block should be removed
i.e. it need to be replaced
\endcomment
this block should remains.
\begincomment
this should be removed too.
\endcomment
我需要找到以\begincomment
开头并以\endcomment
结尾的块,然后将它们删除。
这是我使用的最小代码。我正在使用的正则表达式是\\begin\.*?\\end\comment\
,它应该找到以'\begin' 开头的模式,直到第一次出现'\endcomment'。我在 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 = "\\begincomment\n"+
"this block should be removed\n"+
"i.e. it need to be replaced\n"+
"\\endcomment\n"+
"this block should remains.\n"+
"\\begincomment\n"+
"this should be removed too.\n"+
"\\endcomment";
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】:您必须在 2 点上修复您的代码:
模式应该与您的 Notepad++ 等效模式一致,星号 后面应该跟?
以懒惰:
Matcher m = Pattern.compile("\\\\begin\\comment(?s).*?\\\\end\\comment").matcher(s);
-------------------------------------------------------^
请注意,此模式仅在不存在嵌套注释部分时才能正常工作。
后一个修复涉及逻辑:如果您调用匹配器 replaceAll 函数,它会在执行时替换 每个 匹配部分(已经在第一个 m.find()
循环执行时)。如果您需要循环检查每个注释块,请将其替换为:
output = m.replaceFirst("");
或者直接应用output = m.replaceAll("");
,没有任何循环。
【讨论】:
以上是关于使用 Regex 模式替换文本块(在 java 中)的主要内容,如果未能解决你的问题,请参考以下文章