如何在Java Stream Api中进行模式匹配和字符串替换过滤器?[关闭]

How to do pattern matching and string replace filter within Java stream Api? [closed]

提问人:Vignesh Govindhan 提问时间:11/18/2023 最后编辑:Mark RotteveelVignesh Govindhan 更新时间:11/18/2023 访问量:28

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

昨天关闭。

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="********">
<Customer>
    <Address>
        <AddrID>123</AddrID>
        <AddrLine1>57 Crampton road "</AddrLine1>
            </Address>
     </<Customer>
</Document>

在此 XML 中,我需要将 AddrLine1 中的 “ 替换为 '”'。这需要在所有标记值中完成。因此,我需要替换与模式匹配的文本>&<。

我正在使用流 API 读取 XML 文件。请让我知道如何在流中添加模式匹配和过滤器。

java-8 java-stream 模式匹配

评论

1赞 Mark Rotteveel 11/18/2023
XML 无效,您需要在生成 XML 时修复此问题,而不是在事后修复。
0赞 Reilas 11/18/2023
XML 是否仅包含这些类型的元素?如果是这样,正则表达式就足够了。
0赞 M. Prokhorov 11/21/2023
在使用 XML 时使用正则表达式是一个非常糟糕的主意。它不是一种“常规”语言,表达式将很快变得难以管理和复杂,并且性能可能会比使用专门的流式 XML 解析器时更差。

答:

0赞 TheCodingHornet 11/18/2023 #1

这能回答你的问题吗?

    String inputFile = "path/to/input.xml";
    String outputFile = "path/to/output.xml";

    try (BufferedReader reader = new BufferedReader(new FileReader(inputFile));
         BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
        
        String line;
        Pattern pattern = Pattern.compile(">([^<]*)<");
        while ((line = reader.readLine()) != null) {
            Matcher matcher = pattern.matcher(line);
            StringBuffer sb = new StringBuffer();
            
            while (matcher.find()) {
                String replacement = matcher.group(1).replace("\"", "'\"'");
                matcher.appendReplacement(sb, ">" + replacement + "<");
            }
            matcher.appendTail(sb);

            writer.write(sb.toString());
            writer.newLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

评论

0赞 Reilas 11/18/2023
不错,+1。您应该添加 XML 规范ABNF。而且,您可以在此处使用 PrintWriter