2

次の正規表現があります。

(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$

AZ、aZ、0-9、およびこれらの特殊文字を許可します'.,&@:?!()$#/\

次の一連の文字が文字列内のどこかにこの順序で出現する場合、一致させたくありません。

&#

「&#」だけを入力としてこの正規表現を実行すると、パターンと一致せず、エラーが発生します。正規表現を実行すると'.,&@:?!()$#/\ABC123、パターンと一致しますが、エラーはありません。

ただし、次のように実行すると:

'.,&#@:?!()$#/\ABC123

エラーにもなりません。 シーケンスのチェックに問題があります。

誰かが私が間違ったことを教えてもらえますか、私はこれらのことが得意ではありません.

4

6 に答える 6

6

引用符で囲まれた文字列を一致させるための手法を借りて、文字クラスから削除し、 が続かない&代替を追加し、オプションで文字列が で終わるようにします。& #&

^((?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&[^#])*&?)$

于 2009-01-09T21:20:57.413 に答える
1

私は実際には2つの部分でそれを行います:

  1. 許可されている文字セットを確認してください。これを行うには、許可されていない文字を探し、一致する場合は false を返します。つまり、私は素敵な単純な式を持っていることを意味します:
    [^A-Za-z0-9'\.&@:?!()$#^]
  2. 禁止された部分文字列を確認してください。それは単なる部分文字列であるため、おそらくその部分に正規表現を使用することさえありません。

あなたの言語については言及しませんでしたが、C# の場合:

bool IsValid(string input)
{
    return !(   input.Contains("&#")  
               || Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input) 
            );
}
于 2009-01-09T21:09:57.747 に答える
0

条件付きで2つの正規表現を使用することをお勧めします。

    if (string has sequence "&#")
      return false
    else
      return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")

私はあなたの2番目の「メイン」正規表現を信じています

^([A-Za-z0-9-'.,&@:?!()$#/\])$"

いくつかのエラーがあります:

  • セット内の1文字のみをテストします
  • 正規表現の\文字は、次の文字が文字のある種の「クラス」の一部であることを示すトークンです(例\n:=は改行文字です)。文字シーケンス\]が原因で、括弧で囲まれたリストが終了していません。

使用したほうがいいかもしれません

^[A-Za-z0-9-'.,&@:?!()$#/\\]+$

スラッシュ文字はダブルスラッシュで表されることに注意してください。

+文字は、テストされる少なくとも1つの文字が正規表現と一致する必要があることを示します。長さゼロの文字列を渡しても問題ない場合は、+を。に置き換え*ます。

于 2009-01-09T21:30:29.547 に答える
0

参考までに、Ben Blank の正規表現は機能しますが、必要以上に複雑です。私は次のようにします:

^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$

否定文字クラスの代わりに否定先読みを使用したため、正規表現は、文字列の末尾にあるアンパサンドを照合するための追加のヘルプを必要としません。

于 2009-01-10T04:44:27.690 に答える
0

Perl 互換の RegExp を想定

文字列 '&#' で一致しないようにするには:

(?![^&]*&#)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$

文字列全体に一致するため、括弧は必要ありませんが。

于 2009-01-09T21:16:35.347 に答える
0

^((?!&#)[A-Za-z0-9-'.,&@:?!()$#/\\])*$

最後の \ がエスケープされる (2 倍になる)\\ことに注意してください。

于 2009-01-09T21:20:27.803 に答える