我有以下情况:
我有一把单衬平面锉刀。该行的结构如下:它有一个标题,然后是相应的数据。它看起来像这样:
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 Pattern
和 Matcher
将是可行的方法。
我正在使用 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/