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

正規表現の間隔は、否定されているかどうかに関係なく、常に1文字に一致します。、、などのいずれかに[ADMINISTRATOR]一致します。、、など以外のものと一致します。ADM[^ADMINISTRATOR]ADM

特定の文字列を持たない正規表現が必要な場合は、anubhavaが提案したように、代わりに負の先読みを使用することをお勧めします。

于 2012-11-22T04:29:42.530 に答える