所有字符串的正则表达式不包含字符串?
好吧,所以这是完全愚蠢的事情,但这是我从来没有学会做和它的麻烦。所有字符串的正则表达式不包含字符串?
如何指定不包含其他字符序列的字符串。例如,我想匹配的是不要在“的.config”结尾的行
我会认为我可能只是这样做
.*[^(\.config)]$
但这不起作用(为什么不呢?)
我知道我可以做
.*[^\.][^c][^o][^n][^f][^i][^g]$
但请请请告诉我,有一个更好的办法
这有效,但。*(?!= \。config)$不 - 我认为这两种语法是等价的。任何线索? – 2009-12-28 22:01:10
它们不等价。 (? Manu 2009-12-28 22:05:32
不,它们不是。负面的前瞻是'(?!matchthis)',而你的例子不能工作,因为你已经在字符串末尾('''')的时候向前看。 – 2009-12-28 22:07:22
(?<!\.config)$
:)
除非你是 “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运行得更快。
除非你是grepping,为什么要使用regex呢? Python有'in'的原因。其他语言我确定有类似的解决方案。 – 2009-12-28 22:00:25
是的,这是我现在所做的,但最好是知道如何做到这一点。我遇到了这种情况,这迫使一些尴尬的语法。 – 2009-12-28 22:03:21
通过使用[^]
构造,您创建了否定字符类,它匹配除您命名的字符以外的所有字符。在候选匹配字符的顺序并不重要,因此这将无法在具有任何的[(\.config)
(或[)gi.\onc(]
)任何字符串
使用负先行,(用Perl regexs)像这样:(?!\.config$)
。这将匹配所有不匹配文字“.config”的字符串。
您的问题包含两个问题,所以这里有几个答案。不
匹配线包含某些字符串(比如.config
)在所有:
^(?:(?!\.config).)*$\r?\n?
比赛线路中不某些字符串年底:
^.*(?<!\.config)$\r?\n?
,并作为奖励:匹配线不开始与一定的字符串:
^(?!\.config).*$\r?\n?
(每次都包括换行符,如果有的话)。
哦,并回答为什么你的版本不起作用:[^abc]
的意思是“除a,b或c之外的任何一(1)个字符”。您的其他解决方案也将无法在test.hg
(因为它还在字母G结束 - 你的正则表达式看着一个个字符分别,而不是整个.config
字符串这就是为什么你需要lookaround处理这个
正如你所要求的。一个“更好的方式”:我会尝试一个“过滤”的方法,我觉得这是很容易阅读和理解:
#!/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 ...
我以前Regexpal找到这个页面之前,用以下解决方案上来时,我想检查一个字符串不包含文件扩展名:
^(.(?!\.[a-zA-Z0-9]{3,}))*$
我使用了m
复选框选项,这样我可以显示很多行并查看它们中的哪些行为或不匹配。
所以要找到不包含其他"^(.(?!" +
表达式的字符串,你不希望+ "))*$"
做什么是您使用正则表达式引擎?他们可以在支持的功能。你应该用你正在使用的引擎标记你的问题。 – Andrew 2009-12-28 22:01:57
为什么不使用'grep -v“\ .config”'? – Lazer 2010-05-23 06:32:52
@Lazer - 因为不是世界上的一切都是* nix系统? – 2010-05-23 18:09:35