【问题标题】:Java Multi-line regex to replace multiple instances in a fileJava多行正则表达式替换文件中的多个实例
【发布时间】:2011-03-16 17:14:02
【问题描述】:

好的,所以我一直在寻找关于我的问题的几个小时,但似乎没有出现任何问题。 所以这是我的代码 sn-p 后跟问题:

Pattern forKeys = Pattern.compile("^<feature>\\s*<name>Deviation</name>.*?</feature>", Pattern.DOTALL|Pattern.MULTILINE);
Matcher n = forKeys.matcher("");
String aLine = null;
    while((aLine = in.readLine()) != null) {
         n.reset(aLine);
         String result = n.replaceAll("");
         out.write(result);
         out.newLine();
    }

让我们假设未声明的变量已经声明..

我的意思是,我的 RegEx(也许还有匹配器)无法正常工作。

我想擦除 ff 行中包含“&lt;feature&gt;&lt;name&gt;Deviation&lt;/name&gt;*any character/s here*&lt;/feature&gt;”的部分:

<feature>
    <name>Deviation</name>
            <more words here>
</feature>
<feature>
    <name>Average</name>
</feature>
    <feature>
    <name>Deviation</name>
            sample words
</feature>

我认为我的问题是重复运算符的使用(如何遍历换行符、制表符等),但我似乎找不到正确的表达式。

有什么想法吗?提前致谢。

【问题讨论】:

    标签: java regex multiline


    【解决方案1】:

    Parsing HTML or XML with regexevil and error-prone

    使用 XML 解析器,事情会变得更好。
    这是使用Dom4J 解决您的问题的方法:

    // parse XML source
    Document document = DocumentHelper.parseText(yourXmlText);
    
    Iterator<Element> featureIterator =
        // get an iterator for all <feature> elements
        document.getRootElement().elementIterator("feature");
    
    while(featureIterator.hasNext()){
        Element featureElement = featureIterator.next();
        // if <feature> has a child <name> with Content "Deviation"
        if("Deviation").equals(featureElement.elementTextTrim("name")){
            // remove this <feature> element
            featureIterator.remove();
        }
    }
    
    // write modified XML back to file
    new XMLWriter(
        new FileOutputStream(yourXmlFile), OutputFormat.createPrettyPrint()
    ).write(document);
    

    除此之外,您还犯了一个错误(请参阅我的 cmets):

    // aLine is just a single line
    while((aLine = in.readLine()) != null) {
         n.reset(aLine);
         // yet you want to replace a multi-line pattern
         String result = n.replaceAll("");
         out.write(result);
         out.newLine();
    }
    

    如果您将整个文件读取为字符串,您的正则表达式可能会或可能不会起作用,但如果您将其应用于单独的行,则它无法正常工作。

    【讨论】:

    • 感谢您的快速回复!我会考虑你的建议,因为我没有想到 XML 解析器(我没有使用 Java 的经验,所以知识有限)。我一解决我的问题就会通知你。再次感谢!
    • 只是一个后续。我研究了 XML 解析,而不是使用你的建议,我尝试了 DOM,它可以无缝地工作!谢谢你给我正确的想法。 :)
    • 得到了一些不太好的消息..在成功测试小文件的 DOM 后,它似乎无法有效地处理兆字节大小的 xml 文件(如果堆则崩溃或花费太长时间增加了)..所以,我再次研究了两个解析器:StaX 和您的建议 DOM4J。将再次更新此线程以获取任何新闻。
    • @legaicy 下次尝试提供更多上下文。是的,dom4j 对大文件效率低下,因为它添加了所有的糖。 StaX 或 XPP 效率更高,但也不太舒适
    • 嘿,我实际上使用了 dom4j,因为它看起来更加用户友好。事实证明,它可以处理 25MB 的 XML 文件,我认为处理一个文件只需要几秒钟。只用了几分钟就修改和创建了 100 多个 XML 文件。再次,非常感谢!编辑:实际上,我认为处理我的所有文件不到一分钟。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多