[英]Split on regex and capture matched delimiter expression in Java?
我正在尝试解析一个文本文件,该文件具有一系列以数字开头(后跟NBSP和1-2个空格)的“记录”,包含数百个字母和数字字符,跨行换行符,但不以任何可预见的结果结束。 识别记录结束的唯一方法是命中起始标记的下一个实例,可以通过以下正则表达式进行匹配:
\\d{1,4}\\u00A0\\s+
内容是手动输入的,带有不可预料的换行符,因此我将其删除。 那给我留了一根绳子。
1 blah blah blah 2 blah blah blah ... 875 blah blah blah
由于我知道记录已结束的唯一方法是点击下一个记录ID,因此我尝试仅对上面的正则表达式进行拆分。 这样可以将文件正确地拆分为记录,但是却省略了我需要捕获的记录ID。 我检查了Java文档,但没有捕获被分割的动态值。 我尝试将记录号设为捕获组,但该数据未保留在结果数组中。
这个问题( Java字符串正则表达式的拆分和捕获拆分部分 )看起来很相似,但询问者知道每个文本片段的结尾; 而我只知道每个地方从哪里开始。
那么,有没有其他拆分方法,但可以通过拆分正则表达式保留文本匹配项?
谢谢
不要使用split()
,而是编写自己的regex循环,例如
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 ...
如果您只想检查文本之后是否存在其他文本,但不将其他文本包含在匹配项中(例如检查foo
之后是否为bar
但不包含bar
匹配项),则您正在寻找环视机制或更精确,正面的展望(?=...)
因此,让我们从split("(?=\\\\d{1,4}\\\ \\\\s+)")
。 这将在任何带有NBSP的1-4位数字序列之前和一些空格之前分割。 问题是这样的文本
1234[nbsp]___
描述地点(标有|
)
|1234[nbsp]___
1|234[nbsp]___
12|34[nbsp]___
123|4[nbsp]___
但是我们不想允许在数字之间进行分割。 我们必须增加条件以防止这种分裂。 因此,如果我们能说“在分割的位置之前不能有数字”,那将是很好的。 为此,我们可以在(?<!...)
后面使用负向外观(?<!\\\\d)
。
所以最终的解决方案可能看起来像 :
split("(?<!\\d)(?=\\d{1,4}\\u00A0\\s+)")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.