好的,所以这是完全愚蠢的事情,但这是我从未学会做的事情,也是一件麻烦事。
如何指定不包含其他字符序列的字符串。例如,我想匹配所有不以'.config'
结尾的行我认为我可以做到
.*[^(\.config)]$
但这不起作用(为什么不呢?)
我知道我能做到
.*[^\.][^c][^o][^n][^f][^i][^g]$
但请告诉我有更好的方法
答案 0 :(得分:43)
答案 1 :(得分:16)
你的问题包含两个问题,所以这里有几个答案。
根本不匹配包含某个字符串的行(比如.config
):
^(?:(?!\.config).)*$\r?\n?
在某个字符串中匹配 end 的行:
^.*(?<!\.config)$\r?\n?
并且,作为奖励:将开始的行与某个字符串匹配:
^(?!\.config).*$\r?\n?
(每次包括换行符,如果存在。
哦,并回答为什么你的版本不起作用:[^abc]
表示“除a,b或c之外的任何一个(1)字符”。你的另一个解决方案也会在test.hg
上失败(因为它也以字母g结尾 - 你的正则表达式分别查看每个字符而不是整个.config
字符串。这就是为什么你需要lookaround来处理这个。
答案 2 :(得分:4)
(?<!\.config)$
:)
答案 3 :(得分:2)
除非你“贪图”...因为你没有使用匹配的结果,为什么不搜索以.config结尾的字符串并跳过它们?在Python中:
import re
isConfig = re.compile('\.config$')
# List lst is given
filteredList = [f.strip() for f in lst if not isConfig.match(f.strip())]
我怀疑这会比更复杂的回复更快。
答案 4 :(得分:2)
通过使用[^]
构造,您创建了一个否定的字符类,它匹配除您命名的字符之外的所有字符。候选匹配中的字符顺序无关紧要,因此任何[(\.config)
(或[)gi.\onc(]
)
使用负向前瞻(使用perl正则表达式),如下所示:(?!\.config$)
。这将匹配与文字“.config”
答案 5 :(得分:2)
正如你要求“更好的方法”:我会尝试“过滤”的方法。我认为这很容易阅读和理解:
#!/usr/bin/perl
while(<>) {
next if /\.config$/; # ignore the line if it ends with ".config"
print;
}
正如您所看到的,我使用了perl代码作为示例。但我觉得你明白了吗?
<强>加入强>: 这种方法也可以用来链接更多的过滤模式,它仍然具有良好的可读性和易于理解性,
next if /\.config$/; # ignore the line if it ends with ".config"
next if /\.ini$/; # ignore the line if it ends with ".ini"
next if /\.reg$/; # ignore the line if it ends with ".reg"
# now we have filtered out all the lines we want to skip
... process only the lines we want to use ...
答案 6 :(得分:0)
我在找到此页面之前使用了Regexpal,并在想要检查字符串是否包含文件扩展名时提出了以下解决方案:
^(.(?!\.[a-zA-Z0-9]{3,}))*$
我使用了m
复选框选项,这样我就可以展示很多行,看看哪些行匹配或不匹配。
所以找到一个不包含另一个"^(.(?!" +
表达式的字符串,你不想要+ "))*$"