正则表达式所有不包含字符串的字符串?

时间:2009-12-28 21:47:32

标签: regex

好的,所以这是完全愚蠢的事情,但这是我从未学会做的事情,也是一件麻烦事。

如何指定不包含其他字符序列的字符串。例如,我想匹配所有不以'.config'

结尾的行

我认为我可以做到

.*[^(\.config)]$

但这不起作用(为什么不呢?)

我知道我能做到

.*[^\.][^c][^o][^n][^f][^i][^g]$

但请告诉我有更好的方法

7 个答案:

答案 0 :(得分:43)

您可以使用negative lookbehind,例如:

.*(?<!\.config)$

这匹配所有字符串,但以“.config”

结尾的字符串除外

答案 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复选框选项,这样我就可以展示很多行,看看哪些行匹配或不匹配。

所以找到一个不包含另一个"^(.(?!" +表达式的字符串,你不想要+ "))*$"

My article on the uses of this particular regex