【问题标题】:Using regex in java, parse sections of a text在java中使用正则表达式,解析文本部分
【发布时间】:2017-10-17 02:02:39
【问题描述】:

我有一个文本文件作为 java 字符串。正文的结构如下。我需要解析以名称“子句”开头的每个部分。此示例中包含三个子句。因此,在解析之后,我应该得到三个字符串,每个字符串都以一个子句开头并一直持续到它遇到下一个子句,但不包含它。以下正则表达式给了我类似的东西,但它有多个缺陷。首先,它包含下一节中的“条款”一词。它也省略了最后一个子句。最糟糕的是,在每次迭代中它都会重复所有子句:

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 条如下:

这里还有一些文字。后面的文字可能会在此处的文字中一次或多次包含名称clause

Clause 2. 更多文字(后面的文字也可能包含一次或多次的名称clause。):

(1) 这里有一些文字;

(2) 这里有一些文字;

(3) 这里有一些文字;

第 3 条。 此处为新条款的文本。下面的文字可能会或可能不会在其中包含一次或多次的名称clause。:

(1) 这里有一些文字;

(2) 这里有一些文字;

(3) 这里还有一些文字;

(4) 这里有一些文字;

(5) 和数字文本可以继续;

(6) 并可能指代其他数字,例如:(3) 和 (4)。

通知于(此处的某个日期)

(这是签名)

【问题讨论】:

  • 我不明白你的输出是什么。请添加您希望从您的示例中得到什么。
  • 看看这个来迭代你的匹配stackoverflow.com/questions/16817031/…
  • 请注意Matcher.group() 是整个匹配行而不是任何组,因此它在开头包含单词Clause

标签: java regex


【解决方案1】:

从一个子句的开头匹配到下一个子句的开头,同时不消耗下一个子句的开头的一种方法是使用前瞻。考虑匹配以下模式:

Clause\s*[0-9]+\.((?!Clause\s+[0-9]+\.).)*

这表示要匹配 Clause 和一个数字后跟任何内容,一次一个字符,只要紧随其后的是 not 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

【讨论】:

  • 您好,蒂姆,感谢您的帮助。你的答案非常接近,但它还没有奏效。这完全是我的错,因为我忽略了在每个条款的文本中,可能还重复了“条款”这个名称,如下所示。第 1 条。此处的一些文本后跟“条款”一词,然后是更多文本,然后在同一部分中再次出现“条款”。然后另一部分以“条款”一词开头。我已经更新了原始帖子中的示例以获得更好的解释。您能否重新考虑这个案例并提出建议?
  • 蒂姆,这简直太棒了!非常感谢您的帮助!
猜你喜欢
  • 2016-04-27
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多