我很难理解这个正则表达式。我想做的是如下:
基本上,我想要隐藏任何用除管理员之外的用户名标记的散列注释。
到目前为止,我有以下代码:
if (mb_ereg_match(".*(#[^ADMINISTRATOR]){1,}.*", $comment))
{
$hideComment = true;
}else
{
$hideComment = false;
}
上述代码大部分都有效,但被搜索的文本包含以下任何一项时除外:
#A, #AD, #ADM, #ADMI, #ADMIN, etc.
然后代码不会隐藏评论,这不是我想要的。我只希望与'#ADMINISTRATOR'完全匹配才能显示评论。此外,还应显示任何不包含标签的评论。
知道我做错了吗?
答案 0 :(得分:6)
答案 1 :(得分:1)
我没有使用你用来编写你的正则表达式的任何程序,但一般的语法并没有按照你的想法去做。当你使用一组[]时,你说的是一个字符类。你的正则表达式表明我正在寻找#之后的东西,但是这个东西不是以A或任何以下字符开头的。
您想要使用的是另一个分组。您可以使用()而不是[]来表示特定的字符组。但是,正如您可能注意到的,()也是您用来捕获正则表达式的一部分。因此,您将需要使用不匹配的组。在python中,不匹配的组看起来像这样:(?:ADMINISTRATOR)
所有放在一起,你的正则表达式可能在python中看起来像这样:
mb_ereg_match("(#.*(?!ADMINISTRATOR))\w ",$COMMENT)
答案 2 :(得分:0)
正则表达式中的间隔始终与单个字符匹配,无论是否为否定。 [ADMINISTRATOR]
将匹配A
,D
,M
等。 [^ADMINISTRATOR]
将匹配非A
,D
,M
等任何内容。
如果你想要一个没有给定字符串的正则表达式,我建议使用negative lookahead代替anubhava suggested。