我正在尝试解析一个包含一系列"记录的文本文件"以数字开头(后跟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)似乎相似,但提问者知道每个文本片段的结束位置;而我只知道每个开始的地方。
那么是否有另一种拆分方法,但是通过拆分正则表达式保留文本匹配?
由于
答案 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)
如果您只想检查文字后是否存在其他文字,但未在匹配中包含其他文字(例如检查foo
后bar
是否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