是否可以排除正则表达式匹配的部分?以这种情况为例:
FREE SOFT FOUNDATION V2 1989 PAGE 2
STALLMANWORKS 2000 1977;PAGE 2
THE GNU PAGE 3 1977
我正在尝试仅匹配FREE SOFT FOUNDATION
,STALLMANWORKS 2000
和THE GNU
。这很容易,但是现在我必须排除标题之后的[0-9;]+s?(PAGE)
的任何组合。我尝试了负面的lookahead,但没有运气:
(?!([0-9]+s?(PAGE)))([A-Z0-9s]+)
您需要将负LookAhead与您匹配的每个字符配对。您的示例Regexp仅在第一个字符上进行负LookAhead检查。
类似:
((?:(?!s+V?[0-9]|s+PAGE)[A-Z0-9s])+)
我不确定这里可能需要什么
([sS].*?)b((?:s*d+s+;?|s*d+;)PAGEs+d+|s*PAGE.*[0-9])
可能可以研究。在这里,我们会看到我们想排除的内容,然后我们只会添加:
([sS].*?)
收集我们所需的炭。
demo
如果您只想获得这些匹配项,则可以使用锚点^
来主张字符串的开始;
在您的示例数据中,您似乎不需要页面上的数字。
也许您可以使用脾气暴躁的令牌方法来断言右边的内容不是页面,然后匹配任何字符类[A-Z0-9s]
。
然后确保匹配以大写A-Z结束,然后是单词边界b
,可以选择地匹配4位数字后,在大写A-Z上结束后。
^(?:(?! PAGE)[A-Z0-9s])+[A-Z](?: d{4})?b
说明
-
^
字符串开始 -
(?:
非捕获组-
(?! PAGE)
负LookAhead,断言直接在右边的不是 -
[A-Z0-9s]
匹配字符类中列出的任何一个
-
-
)+
关闭非捕获组,重复1次以上 -
[A-Z]
匹配大写A-Z,然后是一个单词边界 -
(?: d{4})?
可选匹配一个空间和4位数字 -
b
单词边界
REGEX DEMO