1

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

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

本质上,我想隐藏任何用 ADMINISTRATOR 以外的用户名进行哈希标记的评论。

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

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

上面的代码在大多数情况下都有效,除非正在搜索的文本包含以下任何一项:

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

那么代码不会隐藏注释,这不是我想要的。我只想与“#ADMINISTRATOR”完全匹配来显示评论。此外,还应显示任何不包含标签的评论。

知道我做错了什么吗?

4

3 回答 3

6

这是一个基于负前瞻的正则表达式,适用于您:

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

这是一个现场演示

于 2012-11-22T04:28:30.500 回答
1

我没有使用您用来编写正则表达式的任何程序,但是一般的语法并没有按照您的想法进行。当您使用一组 [] 时,您是在说其中包含的是一类字符。您的正则表达式表明我正在寻找跟随 # 的内容,但该内容不以 A 或以下任何字符开头。

您要使用的是另一个分组。您可以使用 () 代替 [] 来表示特定的字符组。但是,您可能会注意到, () 也是您用来捕获部分正则表达式的方法。因此,您需要使用不匹配的组。在 python 中,不匹配的组如下所示: (?:ADMINISTRATOR)

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

mb_ereg_match("(#.*(?!ADMINISTRATOR))\w ",$COMMENT)
于 2012-11-22T04:43:38.643 回答
0

正则表达式中的间隔将始终匹配单个字符,无论是否否定。[ADMINISTRATOR]将匹配A,DM[^ADMINISTRATOR]将匹配任何不是A, D,M等的东西。

如果您想要一个没有给定字符串的正则表达式,我建议您改用负前瞻,正如 anubhava建议的那样。

于 2012-11-22T04:29:42.530 回答