正则表达式 - 查找以#开头但不包含'administrator'的所有单词实例

时间:2012-11-22 04:20:15

标签: regex

我很难理解这个正则表达式。我想做的是如下:

  • 匹配任何以#开头的单词。因此,例如,如果代码找到以下标记#jon,#james,#jill,那么它应该隐藏文本。
  • 但是如果代码发现以下标记的出现:#ADMINISTRATOR,那么它应该显示文本
  • 此外,如果代码未发现任何标有#的单词,则还应显示该文本。

基本上,我想要隐藏任何用除管理员之外的用户名标记的散列注释。

到目前为止,我有以下代码:

if (mb_ereg_match(".*(#[^ADMINISTRATOR]){1,}.*", $comment))
{
    $hideComment = true;
}else
{
    $hideComment = false;
}

上述代码大部分都有效,但被搜索的文本包含以下任何一项时除外:

#A, #AD, #ADM, #ADMI, #ADMIN, etc.

然后代码不会隐藏评论,这不是我想要的。我只希望与'#ADMINISTRATOR'完全匹配才能显示评论。此外,还应显示任何不包含标签的评论。

知道我做错了吗?

3 个答案:

答案 0 :(得分:6)

这是一个适用于您的negative lookahead based regex

(?i)#(?!ADMINISTRATOR)\w+

这是Live Demo

答案 1 :(得分:1)

我没有使用你用来编写你的正则表达式的任何程序,但一般的语法并没有按照你的想法去做。当你使用一组[]时,你说的是一个字符类。你的正则表达式表明我正在寻找#之后的东西,但是这个东西不是以A或任何以下字符开头的。

您想要使用的是另一个分组。您可以使用()而不是[]来表示特定的字符组。但是,正如您可能注意到的,()也是您用来捕获正则表达式的一部分。因此,您将需要使用不匹配的组。在python中,不匹配的组看起来像这样:(?:ADMINISTRATOR)

所有放在一起,你的正则表达式可能在python中看起来像这样:

mb_ereg_match("(#.*(?!ADMINISTRATOR))\w ",$COMMENT)

答案 2 :(得分:0)

正则表达式中的间隔始终与单个字符匹配,无论是否为否定。 [ADMINISTRATOR]将匹配ADM等。 [^ADMINISTRATOR]将匹配非ADM等任何内容。

如果你想要一个没有给定字符串的正则表达式,我建议使用negative lookahead代替anubhava suggested