gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:20:40 25 4
gpt4 key购买 nike

我有以下情况:

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com