正規表現パターン-英数字、特殊文字の束を許可しますが、特定の文字のシーケンスは許可しません
-
06-07-2019 - |
質問
次の正規表現があります:
(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$
A-Z、a-Z、0-9、およびこれらの特殊文字 '。、& @:?!()$#/ \
この順序で文字列内のどこかに次の文字セットが見つかった場合、一致しないようにします。
&#
この正規表現を"&#"だけで実行すると、入力として、それは私のパターンと一致しません、私は素晴らしいエラーを受け取ります。 '。、& @:?!()$#/ \ ABC123
で正規表現を実行すると、パターンと一致し、エラーは発生しません。
ただし、次のコマンドで実行した場合:
'.,&#@:?!()$#/\ABC123
エラーも発生しません。 &#シーケンスのチェックで何か間違ったことをしています。
誰かが私が間違ったことを教えてもらえますか、私はこれらのことについてあまり良くありません。
解決
引用符で囲まれた文字列を照合する手法を借用し、文字クラスから&
を削除し、&
not の代わりに< code>#、文字列がオプションで&amp;
で終わることを許可します:
^((?:[A-Za-z0-9-'。、@:?!()$#/ \\] + |&amp; [^#])*&amp;?)$
他のヒント
実際には、2つの部分でそれを行います:
- 許可されている文字セットを確認します。これを行うには、許可されていない文字を探し、一致する場合はfalseを返します。それは私が素敵な簡単な式を持っていることを意味します:
[^ A-Za-z0-9 '\。&amp; @:?!()$#^]
- 禁止された部分文字列を確認します。そして、それは単なるサブストリングであるため、おそらくその部分に正規表現を使用することすらありません。
言語については言及しませんでしたが、C#の場合:
bool IsValid(string input)
{
return !( input.Contains("&#")
|| Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input)
);
}
^((?!&amp;#)[A-Za-z0-9-'。、&amp; @:?!()$#/ \\])* $
最後の\がエスケープされていることに注意してください(2倍)
SOは自動的に \\
をバックティックにない場合は\に変換します
Perl互換のRegExpを想定
文字列「&amp;#」で一致しないようにするには:
(?![^&amp;] *&amp;#)^([A-Za-z0-9-'。、&amp; @:?!()$#/ \\] *)$
文字列全体を一致させるため、括弧は必要ありません。
参考までに、Ben Blankの正規表現は機能しますが、必要以上に複雑です。私は次のようにします:
^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$
否定された文字クラスの代わりに負の先読みを使用したため、正規表現は文字列の末尾のアンパサンドと一致するために特別なヘルプを必要としません。
条件に2つの正規表現を使用することをお勧めします:
if (string has sequence "&#")
return false
else
return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")
2番目の「メイン」を信じます。正規表現
^([A-Za-z0-9-'.,&@:?!()$#/\])^[A-Za-z0-9-'.,&@:?!()$#/\\]+$
quot;
いくつかのエラーがあります:
- セット内の1文字のみをテストします
- 正規表現の
\
文字は、次の文字が何らかの「クラス」の一部であることを示すトークンです。文字(例:\ n
=は改行文字です)。文字シーケンス\]
は、実際には括弧で囲まれたリストを終了させません。
使用するほうがよい場合があります
<*>スラッシュ文字はダブルスラッシュで表されることに注意してください。
+
文字は、テスト対象の少なくとも1つの文字が正規表現と一致する必要があることを示します。長さ0の文字列を渡すことが問題ない場合は、 +
を *
に置き換えます。