java - 将字符动态插入到 StringBuilder 和 Java Matcher 中

标签 java regex insert stringbuilder matcher

我有以下情况:

我有一把单衬平面锉刀。该行的结构如下:它有一个标题,然后是相应的数据。它看起来像这样:

HEADER1 data data data data data HEADER2 data data HEADER3 data HEADER4 data ....

我必须将这个行转换为一种格式,其中每个 header 及其数据都位于单独的行上。所以,它应该看起来像这样:

HEADER1 data data data data data
HEADER2 data data 
HEADER3 data

“HEADER”本身在长度和它可以使用的字符类型方面遵循一致的模式。因此,我认为 Java Regex PatternMatcher 将是可行的方法。

我正在使用 StringBuilder,因为它有一个 insert() 方法,我用它来插入行分隔符。

我遇到的问题是,我新创建的文件(带有行分隔符插入的文件)末尾总是有一行由多个标题组成,即它们似乎不会分成新行。原因似乎是,一旦 Matcher.find() 偶然发现一个起始索引位于 Matcher 区域 之外的匹配,执行就会退出插入新行的代码。

这种行为非常不一致。我的平面文件相当短(大约 50 行),但问题并未出现。然后我有一个 20K 字节/字符的平面文件,问题出现在其中。

看起来Matcher会执行Matcher.find(),它会读取一个衬垫时提供的初始数据(区域)。假设匹配器区域是从 0 到 19688。但是,当我插入 System.lineSeparator() 时,StringBuilder 的大小动态增加 2 个字节(\r\n)

我尝试使用 Matcher.reset() 或修改 Matcher 的区域,如下所示: Replace text in StringBuilder via regex

我该如何以最有效、最正确的方式处理这个问题? 谢谢

附:正则表达式不是问题。我的正则表达式匹配单行中的每个 header 。只是想我会指出这一点以避免讨论正则表达式本身。

这是我的代码:

    BufferedReader br = new BufferedReader(new FileReader(Constants.SOURCE_LOCATION+fileName));
    try {

        String origLine = br.readLine();

        StringBuilder line = null;

        while (origLine != null) {              
            line = new StringBuilder(origLine);
             Pattern pattern = Pattern.compile(Constants.AL3GROUP_REGEX_PATTERN);
             Matcher matcher = pattern.matcher(line);

                while (matcher.find()) {                            
                        line.insert(matcher.start(), System.lineSeparator());                           
                }                   


            origLine = br.readLine();
        }

        converterFileContents = line.toString();

        PrintWriter writer = new PrintWriter("sample\\output.txt");
        writer.println(converterFileContents);
        writer.close();


        System.out.println(converterFileContents);
    } finally {
        br.close();
    }

最佳答案

尝试替换全部

    str = str.replaceAll(" (HEADER\\d+)", "\r\n$1");

关于java - 将字符动态插入到 StringBuilder 和 Java Matcher 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31408625/

相关文章:

java - 处理来自 @Service 类的 JSP 页面异常

java - 如何在 Jakarta-EE 项目中使用 @Resource 注入(inject) Tomcat 数据源?

新正则表达式 ('regex' , 'flags' ) 和/regex/flags 之间的 JavaScript 差异

python - 多行按照 ":"拆分

sql - 如何在 select 语句中添加从 select 语句派生的列?

java - JPA 多事务管理器

java - 某种外观和感觉是否保证可用?

javascript - 正则表达式,3个或更多字符,最少1个减号,最多3个数字

java - 无法插入数组列表中的最后一个位置

sql-server - Oracle 从函数插入