在正则表达式上拆分并在Java中捕获匹配的分隔符表达式?

时间:2017-01-25 22:24:17

标签: java regex string split

我正在尝试解析一个包含一系列"记录的文本文件"以数字开头(后跟NBSP和1-2个空格),包含数百个字母和数字字符,跨越换行符,但不以任何可预测的结尾。识别记录结尾的唯一方法是点击起始标记的下一个实例,该标记可与以下正则表达式匹配:

\\d{1,4}\\u00A0\\s+ 

内容是手动输入的,有不可预知的换行符,所以我将它们删除了。这给我留下了一个字符串。

1  blah blah blah  2  blah blah blah ... 875  blah blah blah 

由于我知道记录已经结束的唯一方法是通过点击下一个记录ID,我尝试分割上面的正则表达式。这会正确地将文件拆分为记录,但它会省略我需要捕获的记录ID。我检查了Java文档,但没有捕获动态值被分割的内容。我尝试将记录编号设为捕获组,但该数据不会保留在生成的数组中。

这个问题(Java String Regex split and capture splitted portion)似乎相似,但提问者知道每个文本片段的结束位置;而我只知道每个开始的地方。

那么是否有另一种拆分方法,但是通过拆分正则表达式保留文本匹配?

由于

2 个答案:

答案 0 :(得分:3)

不要使用split(),而是编写自己的正则表达式循环,例如

String input = "...your input...";
Matcher m = Pattern.compile("\\d{1,4}\\u00A0\\s+").matcher(input);
int prev = 0;
while (m.find()) {
    String prevText = input.substring(prev, m.start());
    prev = m.end();
    String delimiter = m.group();
    // ... code here ...
}
String tailText = input.substring(prev); // text after last delimiter
// ... code here ...

答案 1 :(得分:2)

如果您只想检查文字后是否存在其他文字,但未在匹配中包含其他文字(例如检查foobar是否bar但不包括(?=...)在匹配中)那么你正在寻找look-around mechanism或更准确,正面向前看split("(?=\\d{1,4}\\u00A0\\s+)")

让我们从1234[nbsp]___ 开始吧。这将在任何具有NBSP的1-4位数字和一些空格之前分开。问题在于像

这样的文本
|

这描述了地点(标有|1234[nbsp]___ 1|234[nbsp]___ 12|34[nbsp]___ 123|4[nbsp]___

(?<!...)

但我们不希望允许在数字之间进行拆分。我们必须添加条件以防止这种分裂。所以如果我们可以说“在拆分之前不能有数字”那就太好了。要做到这一点,我们可以在(?<!\\d)后面使用负面看法,在我们的例子中看起来像split("(?<!\\d)(?=\\d{1,4}\\u00A0\\s+)")

所以最终解决方案看起来像

.indexOf