当前位置: 首页 > 知识库问答 >
问题:

使用正则表达式模式替换文本块(在java中)

胡云瀚
2023-03-14

我正试图用正则表达式从一个文件中删除一组文本。现在我有了一个< code >字符串中的文件内容,但是< code >匹配器找不到模式。示例文件是:

\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}

我需要找到以\开始{评论}开头和以\结束{评论}结尾的块,然后删除它们。这是我使用的最小代码。我使用的正则表达式是\\开始\{。*?\\结束\{评论\},它应该查找和模式从“\开始”开始,直到第一次出现“\结束{评论}”。我在记事本上工作。

然而,使用这个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("");
        }
    }
}

更新:

我用这个在线工具找到了它。matcher m = pattern . compile(" \ \ begin \ { comment(?s)。\\end\{comm?\}").匹配器;

共有1个答案

欧桐
2023-03-14

您必须在2个点中修复代码:

>

  • 模式应该与你的记事本等效一致,星号后面应该跟懒惰:

    Matcher m = Pattern.compile("\\\\begin\\{comment}(?s).*?\\\\end\\{comment}").matcher(s);
    -------------------------------------------------------^
    

    请注意,只有当不存在嵌套注释部分时,此模式才能正常工作。

    后一个修复涉及逻辑:如果您调用matcher replaceAll函数,它会在执行时替换每个匹配部分(已经在第一次m.find()循环执行时)。如果您需要循环检查每个注释块,请将其替换为:

    output = m.replaceFirst("");
    

    或者直接应用< code > output = m . replace all(" ");完全没有任何循环。

  •  类似资料:
    • 问题内容: 我有这个字符串: 现在,我想在每个数字之前添加String num:。 因此结果必须是: 这也必须工作: 用于搜索数字的正则表达式是:[0-9]+ 但是我想用num:+ [匹配的子字符串]替换匹配的子字符串。 我现在写了一个带有数字的示例,但另一个示例可以是:在每个电子邮件地址之前添加 ·Email found·: 问题答案: 利用分组。您可以使用括号(并)定义组,并通过组索引$n在哪

    • Change is inevitable, except from vending machines. — Robert C. Gallagher Puppet 的 regsubst 函数提供了一种处理文本的简单方法, 用于在字符串中查找和替换,或者从字符串提取匹配的模式。 例如,我们通常需要对从 facter 或者从外部程序获得的数据做这样的处理。 在本例中将会看到如何使用 regsubst 提

    • 为什么要学正则表达式 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网站去搜索) 爬 (将所有的网站的内容全部爬下来) 取 (去掉对我们没用处的数据) 处理数据(按照我们想要的方式存储和使用) 我们在昨天的案例里实际上省略了第3步,也就是”取”的步骤。因为我们down下了的数据是全部的网页,这些数据很庞大并且很混乱,大部分的东西使我们不关心的,因此我们需要将之按我们的需要过

    • 问题内容: 我需要替换字符串的一部分。我浏览了Python文档并发现了re.sub。 我期望这能打印,而不是“酒吧”。 谁能告诉我我做错了什么? 问题答案: 除了捕获要 替换 的零件外,您还可以捕获要 保留 的零件,然后使用引用对其进行引用以将它们包括在替换字符串中。 尝试以下方法: 另外,假设这是HTML,则应考虑使用HTML解析器来执行此任务,例如Beautiful Soup 。

    • 通过好奇心,有没有办法用Java Stream编写它?

    • 问题内容: 我已将一些定价数据读入pandas数据框中,其值显示为: 我想将其简化为数字值。我知道我可以遍历并应用正则表达式 到每个字段,然后将结果列表重新组合在一起,但是有没有一种循环的方式? 谢谢 问题答案: 您可以使用删除所有非数字: regex101演示