多行文字的负前瞻断言

时间:2019-02-11 05:52:14

标签: java regex

我正在寻找一种检查多行字符串(来自pdf)是否包含特定字母组合的方法,该组合不能以特定前缀开头。具体来说,我正在尝试查找包含ARC但不包含NON-ARC的字符串。

我找到了一个很好的例子Regular expression for a string that does not start with a sequence,但似乎不适用于我的问题。使用我的模式^(?!NON\\-)ARC.*,我在单行测试中获得了预期的结果,而在实际输入的情况下,负前瞻性断言具有误报。这是我所做的:

@Test
public void testRegexLookAhead() {
    String strTestSimplePos = "ARC 0.1-1";
    String strTestSimpleNeg = "NON-ARC 3.4-1";

    String strTestRealPos = "HEADLINE\r\n" + "Subheader Author\r\n" + "ARC 0.1-1\r\n" + "20190211";
    String strTestRealNeg = "HEADLINE\r\n" + "Subheader Author\r\n" + "NON-ARC 0.1-1\r\n" + "20190211";

    //based on https://stackoverflow.com/questions/899422/regular-expression-for-a-string-that-does-not-start-with-a-sequence
    String regexNoNON = "^(?!NON\\-)ARC.*";               

    Pattern noNONPatter = Pattern.compile(regexNoNON);

    System.out.println(noNONPatter.matcher(strTestSimplePos).find()); //true OK 
    System.out.println(noNONPatter.matcher(strTestSimpleNeg).find()); //false OK
    System.out.println(noNONPatter.matcher(strTestRealPos).find()); //false but should be true -> does not work as intended
    System.out.println(noNONPatter.matcher(strTestRealNeg).find()); //false OK 

如果有人可以指出出了什么问题会很高兴...

编辑:这被标记为How to use java regex to match a line的重复-但是我根本没有尝试使用正则表达式来匹配一行。只是需要一种方法来查找多行文本输入的特定顺序(负向提前)。解决另一个问题的一种方法也是解决这个问题的方法(使用java.util.regex.Pattern.MULTILINE编译模式)-但问题最多是相关的。

2 个答案:

答案 0 :(得分:1)

尝试此正则表达式:

HEADLINE(?:(?!HEADLINE)[\s\S])*(?<!NON-)ARC(?:(?!HEADLINE)[\s\S])*

Click for Demo

JAVA Code

说明:

  • HEADLINE-匹配单词HEADLINE
  • (?:(?!HEADLINE)[\s\S])*-匹配0+次出现的不以单词HEADLINE开头的任何字符
  • (?<!NON-)ARC-如果单词ARC不在紧跟NON-之前,则与单词(?:(?!HEADLINE)[\s\S])*
  • 匹配
  • HEADLINE-匹配0+次出现的不以单词require开头的任何字符

答案 1 :(得分:1)

您的输入字符串有多行,并且您使用的插入符号是,您需要添加多行标志:

Pattern.compile(regexNoNON, java.util.regex.Pattern.MULTILINE);

关于MULTILINE

  

启用多行模式。

     

在多行模式下,表达式^和$分别在行终止符或输入序列的结尾之后或之前匹配。默认情况下,这些表达式仅在整个输入序列的开头和结尾匹配。