在java中使用regex,解析文本的各个部分

时间:2017-10-17 02:02:40

标签: java regex

我有一个文本文件作为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)。

     

通知(某些日期)

     

(这是签名)

1 个答案:

答案 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.

在这里演示:

Rextester