繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM