我知道可以匹配一个单词,然后用其他工具逆转比赛(例如 grep -v)。但是,可以匹配不包含一个特定的单词,例如 hede,使用常规表达式的线条吗?
入口:
hoho
hihi
haha
hede
代码:
grep "<Regex for 'doesn't contain hede'>" input
所需的产量:
hoho
hihi
haha
我知道可以匹配一个单词,然后用其他工具逆转比赛(例如 grep -v)。但是,可以匹配不包含一个特定的单词,例如 hede,使用常规表达式的线条吗?
入口:
hoho
hihi
haha
hede
代码:
grep "<Regex for 'doesn't contain hede'>" input
所需的产量:
hoho
hihi
haha
当前回答
在我看来,一个更可读的答案:
^(?!.*hede)
基本上,“在线的开始,如果和只有如果它没有“<unk>”在它” - 所以要求几乎直接翻译成 reggex。
当然,有可能有多个失败要求:
^(?!.*(hede|hodo|hada))
详细信息: ^ anchor 确保 regex 引擎不会在行中的每个位置撤回比赛,这将匹配每个行。
接口工具匹配每行一次,在与多线条合作的背景下,您可以使用“m”旗帜:
/^(?!.*hede)/m # JavaScript syntax
或
(?m)^(?!.*hede) # Inline flag
其他回答
如何使用PCRE的背景跟踪控制字符,以匹配一行不包含单词
下面是我以前从未使用过的一种方法:
/.*hede(*COMMIT)^|/
它是如何工作的
首先,它试图在线上的某个地方找到“故障”。如果成功,在这一点上,(COMMIT)告诉发动机,不只是在故障的情况下不落后,而且也不会试图在这种情况下进一步匹配。
如果一行不包含“干”则第二个替代品,一个空的子模式,成功地匹配主题行。
这个方法不比一个负面看法更有效,但我想我只是把它扔在这里,如果有人发现它是零,并找到一个用于其他,更有趣的应用程序。
只要你正在处理线路,只需标记负面比赛,并瞄准其余。
事实上,我用这个技巧与 sed 因为 ^(?!hede)*$ 看起来不受它支持。
对于所需的产量
标记负面相匹配:(例如,线与目标),使用一个字符不包含在整个文本,一个 emoji 可能是一个很好的选择为此目的。 s/(*hede)/\1/g 目标其余(未标记的线:例如,线与目标无目标)。 假设你只想保持目标并删除其余(如你想要): s/^。
为了更好的理解
假设你想删除目标:
我想添加另一个例子,如果你试图匹配一个包含X线的整个线,但也不包含Y线。
这个 regex 模式会工作(在 JavaScript 中也工作)
^(?=.*?tasty-treats)((?!chocolate).)*$
(全球,多线旗在例子中)
互动示例: https://regexr.com/53gv4
比赛
(这些 URL 包含“蛋糕治疗”并且不包含“巧克力”)
example.com/tasty-treats/strawberry-ice-cream example.com/甜点/tasty-treats/banana-pudding example.com/tasty-treats-overview
没有匹配
example.com/tasty-treats/chocolate-cake example.com/home-cooking/over-roasted-chicken example.com/tasty-treats/banana-chocolate-fudge example.com/desserts/chocolate/tasty-treats example.com/chocolate/tasty-treats/desserts
也许你会在谷歌上找到这一点,同时试图写一个能够匹配一行(与整个行相反)的分区,这些分区不包含一个字符。
根据字符串: <span class="good">bar</span><span class="bad">foo</span><span class="ugly">baz</span>
我想匹配 <span> 标签,这些标签不包含“坏”字符。
/<span(?:(?!坏)*?>将匹配 <span class=\"good\">和 <span class=\"ugly\">。
请注意,有两组(层)的偏见:
最内在的是对负面观点(这不是捕捉群体) 最外在是由Ruby作为捕捉群体解释的,但我们不希望它成为捕捉群体,所以我补充说:它是开始,它不再被解释为捕捉群体。
在Ruby中展示:
s = '<span class="good">bar</span><span class="bad">foo</span><span class="ugly">baz</span>'
s.scan(/<span(?:(?!bad).)*?>/)
# => ["<span class=\"good\">", "<span class=\"ugly\">"]
不是雷格斯,但我发现使用带管的序列粘贴是合乎逻辑和有用的,以消除噪音。
例如,搜索一个 Apache 配置文件,没有所有评论 -
grep -v '\#' /opt/lampp/etc/httpd.conf # this gives all the non-comment lines
和
grep -v '\#' /opt/lampp/etc/httpd.conf | grep -i dir
序列格雷普的逻辑是(不是一个评论)和(比赛是)