2009-12-28 102 views
19

好吧,所以这是完全愚蠢的事情,但这是我从来没有学会做和它的麻烦。所有字符串的正则表达式不包含字符串?

如何指定不包含其他字符序列的字符串。例如,我想匹配的是不要在“的.config”结尾的行

我会认为我可能只是这样做

.*[^(\.config)]$ 

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

我知道我可以做

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

但请请请告诉我,有一个更好的办法

+1

做什么是您使用正则表达式引擎?他们可以在支持的功能。你应该用你正在使用的引擎标记你的问题。 – Andrew 2009-12-28 22:01:57

+1

为什么不使用'grep -v“\ .config”'? – Lazer 2010-05-23 06:32:52

+6

@Lazer - 因为不是世界上的一切都是* nix系统? – 2010-05-23 18:09:35

回答

40

您可以使用negative lookbehind,如:

.*(?<!\.config)$ 

这除了那些用 “的.config”

+0

这有效,但。*(?!= \。config)$不 - 我认为这两种语法是等价的。任何线索? – 2009-12-28 22:01:10

+2

它们不等价。 (?<!)匹配前面的字符串(后面看),而(?!)匹配下面的字符串(向前看) – Manu 2009-12-28 22:05:32

+1

不,它们不是。负面的前瞻是'(?!matchthis)',而你的例子不能工作,因为你已经在字符串末尾('''')的时候向前看。 – 2009-12-28 22:07:22

2

除非你是 “grepping” 结尾的所有字符串匹配...由于您没有使用匹配结果,为什么不搜索以.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())] 

我怀疑这会比一个更复杂的re运行得更快。

+1

除非你是grepping,为什么要使用regex呢? Python有'in'的原因。其他语言我确定有类似的解决方案。 – 2009-12-28 22:00:25

+0

是的,这是我现在所做的,但最好是知道如何做到这一点。我遇到了这种情况,这迫使一些尴尬的语法。 – 2009-12-28 22:03:21

2

通过使用[^]构造,您创建了否定字符类,它匹配除您命名的字符以外的所有字符。在候选匹配字符的顺序并不重要,因此这将无法在具有任何的[(\.config)(或[)gi.\onc(])任何字符串

使用负先行,(用Perl regexs)像这样:(?!\.config$)。这将匹配所有不匹配文字“.config”的字符串。

15

您的问题包含两个问题,所以这里有几个答案。不

匹配线包含某些字符串(比如.config)在所有:

^(?:(?!\.config).)*$\r?\n? 

比赛线路中不某些字符串年底

^.*(?<!\.config)$\r?\n? 

,并作为奖励:匹配线不开始与一定的字符串:

^(?!\.config).*$\r?\n? 

(每次都包括换行符,如果有的话)。

哦,并回答为什么你的版本不起作用:[^abc]的意思是“除a,b或c之外的任何一(1)个字符”。您的其他解决方案也将无法在test.hg(因为它还在字母G结束 - 你的正则表达式看着一个个字符分别,而不是整个.config字符串这就是为什么你需要lookaround处理这个

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 ... 
0

我以前Regexpal找到这个页面之前,用以下解决方案上来时,我想检查一个字符串不包含文件扩展名:

^(.(?!\.[a-zA-Z0-9]{3,}))*$我使用了m复选框选项,这样我可以显示很多行并查看它们中的哪些行为或不匹配。

所以要找到不包含其他"^(.(?!" +表达式的字符串,你不希望+ "))*$"

My article on the uses of this particular regex

相关问题