如何否定正则表达式验证字符串?

时间:2013-04-29 14:06:27

标签: regex string negate

我想替换除@ [anyword]

之外的所有字符串

我有这样的字符串:

yng nnti dkasih tau :)"@mazayalinda: Yg klo ada cenel busana muslim aku mau ikutan dong "@noviwahyu10: Model ! Pasti gk blh klo k

@mazayalinda@noviwahyu10与我的正则表达式@\w*匹配。

但是,除了上面的2个单词之外,我需要删除所有字符串。我们需要做出否定,但我混淆了组合2个正则表达式,它们是匹配@[anyword]的正则表达式和除掉那2个单词之外的所有句子。

有什么想法吗?

5 个答案:

答案 0 :(得分:2)

从上下文来看,如果这是一个可行的解决方案并不完全清楚,但是当你想要替换除某个模式之外的所有内容时,听起来更像是你想要一个正则表达式搜索而不是替换。例如,在python中它可能看起来像:

>>> import re
>>> s = 'yng nnti dkasih tau :)"@mazayalinda: Yg klo ada cenel busana muslim aku mau ikutan dong "@noviwahyu10: Model ! Pasti gk blh klo k'
>>> re.findall(r'@\w+', s)
['@mazayalinda', '@noviwahyu10']

编辑:在js中,这样的事情会更合适:

var s = 'yng nnti dkasih tau :)"@mazayalinda: Yg klo ada cenel busana muslim aku mau ikutan dong "@noviwahyu10: Model ! Pasti gk blh klo k';

// code from http://www.activestate.com/blog/2008/04/javascript-refindall-workalike
var rx = new RegExp("@\\w+", "g");
var matches = new Array();
while((match = rx.exec(s)) !== null){
    matches.push(match);
}

在此之后,matches包含所有匹配的字符串。如果需要,您可以将它连接在一起作为单个字符串。

答案 1 :(得分:0)

在我看来,你想要使用捕获组,而不是完全否定字符串的其余部分,像一个正则表达式:

[^@]*(@\w+)[^@]*

将在捕获组中捕获这些条目,然后根据您的语言,您可以访问每个捕获的字符串:http://rubular.com/r/qHKb35OK3g

答案 2 :(得分:0)

使用此正则表达式(?<=^|@\w+\b)[^@]+和联合匹配

答案 3 :(得分:0)

好吧,我不完全确定我理解这个问题,但是如果你只想保留名字并使用其余的只是“摆脱它”,为什么不简单地保存名称而忽略休息?

如果你热衷于匹配“非名称模式” - 这似乎是某种对话的摘录,其中每条消息都以':'开头。如果是这样,那么使用它应该只是诀窍。

:[^ @] *

答案 4 :(得分:-1)

您可以使用零宽度否定断言,即@(?!mazayalinda|noviwahyu10)\w

这需要一些复杂的正则表达式引擎,如Perl,Ruby,Java等。 如果您有经典引擎,那么@pcalcao sais的方式最好。