【问题标题】:How to match a line not containing a word [duplicate]如何匹配不包含单词的行[重复]
【发布时间】:2011-09-09 16:59:27
【问题描述】:

我想知道如何使用 Python 风格的 Regex 匹配不包含特定单词的行(只使用 Regex,不涉及 Python 函数)?

例子:

PART ONE OVERVIEW 1 
Chapter 1 Introduction 3

我要匹配不包含“PART”字样的行?

【问题讨论】:

  • 你打算用什么来做匹配?
  • PART 总是出现在开头吗?
  • @David:只要澄清一下这个例子。
  • 正确答案是^(?!.*PART).*$。或^(?!.*\bPART\b).*$,如果需要进行全字检查。或者,如果不需要整个字符串匹配,请从上述两者中删除 .*$

标签: regex


【解决方案1】:

这应该可行:

/^((?!PART).)*$/

如果您只想从行首排除它(我知道您不这样做,但仅供参考),您可以使用:

/^(?!PART)/

编辑(按要求):为什么这种模式有效

(?!...) 语法是 negative lookahead,我一直觉得很难解释。基本上,它的意思是“这点后面的任何内容都不能匹配正则表达式/PART/。” 我链接的网站比我能解释的要好得多,但我会尝试分解它:

^         #Start matching from the beginning of the string.    
(?!PART)  #This position must not be followed by the string "PART".
.         #Matches any character except line breaks (it will include those in single-line mode).
$         #Match all the way until the end of the string.

((?!xxx).)* 成语可能是最难理解的。正如我们所看到的,(?!PART) 看着前面的字符串并说接下来的任何内容都无法匹配子模式/PART/。所以我们对((?!xxx).)* 所做的是逐个字母地检查字符串并将规则应用于所有字符串。每个字符都可以是任何字符,但如果您使用该字符及其后面的几个字符,则最好不要使用 PART 这个词。

^$ 锚点要求将规则从头到尾应用于整个字符串。如果没有这些锚,任何不以 PART 开头的字符串都将是匹配的。甚至 PART 本身也会有匹配项,因为(例如)字母 A 后面没有跟确切的字符串 PART

由于我们确实有^$,如果PART 在字符串中的任何位置,则其中一个字符将匹配(?=PART).,并且整体匹配将失败。希望这足够清楚以提供帮助。

【讨论】:

  • 对我来说,我需要在另一个特定单词 -word2 之前搜索没有特定单词 -word1 的行。所以我像这样使用负面的lookbehind: (?!
  • 非常感谢区分搜索行首和搜索整行。你拯救了我的一天。
  • 我试图用它来摆脱像 'Sensor_5_Wind' 这样的字符串,但是 /^((?!Wind).)*$/ 不起作用?
  • @KillerSnail - 我没有足够的信息来帮助你;尝试提出一个单独的问题。
  • 如果您使用 grep,请使用 -P 选项。例如grep -P '(?!不包括这个字符串)'
猜你喜欢
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2017-02-06
相关资源
最近更新 更多