我正在寻找一种检查多行字符串(来自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编译模式)-但问题最多是相关的。
答案 0 :(得分:1)
尝试此正则表达式:
HEADLINE(?:(?!HEADLINE)[\s\S])*(?<!NON-)ARC(?:(?!HEADLINE)[\s\S])*
说明:
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:
启用多行模式。
在多行模式下,表达式^和$分别在行终止符或输入序列的结尾之后或之前匹配。默认情况下,这些表达式仅在整个输入序列的开头和结尾匹配。