我有一个文本文件作为java String。该文本具有以下结构。我需要解析以名称" Clause"开头的每个部分。这个例子中有三个子句。因此,在解析之后我应该得到三个字符串,每个字符串以一个Clause开头并继续直到它到达下一个子句,但不包含它。以下正则表达式给了我类似的东西,但它有多个缺陷。首先,它包括下一节中的Clause一词。它也省略了最后一个条款。最糟糕的是,在每次迭代中,它都会重复所有的条款:
for(int i = 0; i < clauseCount - 1; i++) {
String p2 = "(Clause(.*)Clause)";
Pattern pattern2 = Pattern.compile(p2, Pattern.DOTALL);
Matcher matcher2 = pattern2.matcher(extractedText);
if(matcher2.find()){
System.out.println("Matched: " + matcher2.group());
}
}
以下是包含三个子句的示例文本。但是有多个文件,每个文件中的子句数量不同。能否请你帮忙?我很感激您的反馈。
标题在这里
这里有一些文字:
第1条。以下内容:
这里也有一些文字。下面的文字可能会在此处的文字中包含名称子句一次或多次。
第2条。此处有更多文字(后面的文字也可能包含名称子句一次或多次。):
(1)这里的一些文字;
(2)这里的一些文字;
(3)这里的一些文字;
条款3。此处为新条款的文字。随后的文本可能包含或不包含名称子句一次或多次。:
(1)这里的一些文字;
(2)这里的一些文字;
(3)这里有更多的文字;
(4)这里的一些文字;
(5)和计算的文本可以继续;
(6)并且可以参考如下的其他数字:(3)和(4)。
通知(某些日期)
(这是签名)
答案 0 :(得分:1)
从子句的开头到下一个子句的开头匹配的一种方法是使用前瞻,而不消耗下一个子句的开头。考虑与以下模式匹配:
Clause\s*[0-9]+\.((?!Clause\s+[0-9]+\.).)*
这表示匹配Clause
和后跟任何内容的数字,一次只能匹配一个字符,只要紧接其后的字符不 Clause
后跟一个数字,一个点。
String input = "Clause 1. Stuff is a Clause here\nClause 2. More Clause stuff is here.";
String pattern = "Clause\\s*[0-9]+\\.((?!Clause\\s+[0-9]+\\.).)*";
Pattern r = Pattern.compile(pattern, Pattern.DOTALL);
Matcher m = r.matcher(input);
while (m.find()) {
System.out.println("Found value: " + m.group(0));
}
<强>输出:强>
Found value: Clause 1. Stuff is a Clause here
Found value: Clause 2. More Clause stuff is here.
在这里演示: