如何排除正则表达式匹配的一部分



是否可以排除正则表达式匹配的部分?以这种情况为例:

FREE SOFT FOUNDATION V2 1989 PAGE 2
STALLMANWORKS 2000 1977;PAGE 2
THE GNU PAGE 3 1977

我正在尝试仅匹配FREE SOFT FOUNDATIONSTALLMANWORKS 2000THE 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

相关内容

最新更新