开发者

How to match a line not containing a word [duplicate]

开发者 https://www.devze.com 2023-03-10 16:38 出处:网络
This question already has answers here: Regular expression to match a line that doesn't contain a word
This question already has answers here: Regular expression to match a line that doesn't contain a word (34 answers) Closed 6 years ago.

I was wondering how to match a line not containing a specific word using Python-style Regex (Just use Regex, not involve Python functions)?

Examp开发者_如何学Cle:

PART ONE OVERVIEW 1 
Chapter 1 Introduction 3

I want to match lines that do not contain the word "PART"?


This should work:

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

Edit (by request): How this works

The (?!...) syntax is a negative lookahead, which I've always found tough to explain. Basically, it means "whatever follows this point must not match the regular expression /PART/." The site I've linked explains this far better than I can, but I'll try to break this down:

^         #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.

The ((?!xxx).)* idiom is probably hardest to understand. As we saw, (?!PART) looks at the string ahead and says that whatever comes next can't match the subpattern /PART/. So what we're doing with ((?!xxx).)* is going through the string letter by letter and applying the rule to all of them. Each character can be anything, but if you take that character and the next few characters after it, you'd better not get the word PART.

The ^ and $ anchors are there to demand that the rule be applied to the entire string, from beginning to end. Without those anchors, any piece of the string that didn't begin with PART would be a match. Even PART itself would have matches in it, because (for example) the letter A isn't followed by the exact string PART.

Since we do have ^ and $, if PART were anywhere in the string, one of the characters would match (?=PART). and the overall match would fail. Hope that's clear enough to be helpful.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号