我知道可以匹配一个单词,然后用其他工具逆转比赛(例如 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
当前回答
OP 没有指定或标记帖子,以显示背景(编程语言、编辑器、工具)中将使用 Regex。
对于我来说,有时我需要在使用 Textpad 编辑文件时做到这一点。
Textpad 支持一些 Regex,但不支持 lookahead 或 lookbehind,所以需要几步。
Search string:^(.)
Replace string:<@#-unique-#@>\1
Replace-all
Search string:<@#-unique-#@>.*hede.*\n
Replace string:<nothing>
Replace-all
此分類上一篇
此分類上一篇
Search string:<@#-unique-#@>
Replace string:<nothing>
Replace-all
现在你有原始文本,所有包含字符串的线条已被删除。
此分類上一篇
Search string:^(.)
Replace string:<@#-unique-#@>\1
Replace-all
对于包含字符串标签的所有行,请删除独特的“标签”:
Search string:<@#-unique-#@>(.*hede)
Replace string:\1
Replace-all
此分類上一篇
此时此刻,所有以独特的“标签”开始的线条,不包含线条标签,我现在只能用这些线条来做我的某事。
当我完成时,我将从所有行中删除独特的“标签”(替换行是空的):
Search string:<@#-unique-#@>
Replace string:<nothing>
Replace-all
其他回答
如何使用PCRE的背景跟踪控制字符,以匹配一行不包含单词
下面是我以前从未使用过的一种方法:
/.*hede(*COMMIT)^|/
它是如何工作的
首先,它试图在线上的某个地方找到“故障”。如果成功,在这一点上,(COMMIT)告诉发动机,不只是在故障的情况下不落后,而且也不会试图在这种情况下进一步匹配。
如果一行不包含“干”则第二个替代品,一个空的子模式,成功地匹配主题行。
这个方法不比一个负面看法更有效,但我想我只是把它扔在这里,如果有人发现它是零,并找到一个用于其他,更有趣的应用程序。
# 一个简单的方式
import re
skip_word = 'hede'
stranger_char = '虩'
content = '''hoho
hihi
haha
hede'''
print(
'\n'.join(re.findall(
'([^{}]*?)\n'.format(stranger_char),
content.replace(skip_word, stranger_char)
)).replace(stranger_char, skip_word)
)
# hoho
# hihi
# haha
也许你会在谷歌上找到这一点,同时试图写一个能够匹配一行(与整个行相反)的分区,这些分区不包含一个字符。
根据字符串: <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\">"]
使用(?<!hede)是更好的答案(?<!whateverYouDontWantToMatch)是一个负面看向后,而不是(?!whateverYouDontWantToMatch)这是一个负面看向前。这意味着(?<!)它会检查正确的当前位置的线条而不是只是观看比赛。
请注意,解决方案不会从“现在”开始:
^(?!hede).*$
一般来说,它比解决方案不包含“这些”的更有效:
^((?!hede).)*$
前者只在输入行的第一个位置检查“点”而不是每个位置。