是否可以排除部分正则表达式匹配项?以这种情况为例:
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)
的任何组合。我尝试进行负面的前瞻,但没有运气:
(?!([0-9]+\s?(PAGE)))([A-Z0-9\s]+)
答案 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
字边界答案 1 :(得分:0)
我不太确定这里可能需要什么,我想也许是这种表达方式
([\s\S].*?)\b((?:\s*\d+\s+;?|\s*\d+;)PAGE\s+\d+|\s*PAGE.*[0-9])
可以研究一下。在这里,我们将看到要排除的内容,然后只需添加:
([\s\S].*?)
收集我们想要的字符。
答案 2 :(得分:0)
您需要将负前瞻与您匹配的每个字符配对。您的示例regexp仅在第一个字符处进行否定超前检查。
类似的东西:
((?:(?!\s+V?[0-9]|\s+PAGE)[A-Z0-9\s])+)