如何排除部分正则表达式匹配项?

时间:2019-07-01 18:38:46

标签: regex regex-lookarounds

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

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)的任何组合。我尝试进行负面的前瞻,但没有运气:

(?!([0-9]+\s?(PAGE)))([A-Z0-9\s]+)

3 个答案:

答案 0 :(得分:1)

如果只想获取那些匹配项,则可以使用锚点^来声明字符串的开头;

在您的示例数据中,您似乎不需要在页面前输入数字。

也许您可以使用tempered greedy token方法来断言右边不是PAGE的内容,然后匹配任何字符类[A-Z0-9\s]

然后确保匹配以大写A-Z结尾,后跟单词边界\b,可以选择以大写A-Z结尾之后匹配4位数字。

^(?:(?! PAGE)[A-Z0-9\s])+[A-Z](?: \d{4})?\b

说明

  • ^字符串的开头
  • (?:非捕获组
    • (?! PAGE)负向前进,断言直接在右边的不是
    • [A-Z0-9\s]匹配字符类中列出的任何一个
  • )+关闭非捕获组并重复1次以上
  • [A-Z]匹配大写字母A-Z,后跟单词边界
  • (?: \d{4})?可以选择匹配空格和4位数字
  • \b字边界

Regex demo

答案 1 :(得分:0)

我不太确定这里可能需要什么,我想也许是这种表达方式

([\s\S].*?)\b((?:\s*\d+\s+;?|\s*\d+;)PAGE\s+\d+|\s*PAGE.*[0-9])

可以研究一下。在这里,我们将看到要排除的内容,然后只需添加:

 ([\s\S].*?)

收集我们想要的字符。

Demo

答案 2 :(得分:0)

您需要将负前瞻与您匹配的每个字符配对。您的示例regexp仅在第一个字符处进行否定超前检查。

类似的东西:

((?:(?!\s+V?[0-9]|\s+PAGE)[A-Z0-9\s])+)