2011-12-19 29 views
3

問題があります。C#で正規表現が正常に動作しない

スウェーデン語のキーボード(文字マップなどを使用しない)で見ることができるすべてのものをユーザーが書き込めるようにします。これはすべて英語の英数字とåäöを意味します。許可される英数字以外の文字は§½!"@#£¤$%&{/()[]=}?+\´`^などです。

私の式は次のとおりです。

[\wåäö§½!"@#£¤$%&/{()=}?\\\[\]+´`^¨~'*,;.:\-_<>|] 

C#では、それは次のようになります。

Regex allowedChars = new Regex("@[\\wåäö§½!\"@#£¤$%&/{()=}?\\\\[\\]+´`^¨~'*,;.:\\-_<>|]"); 

私はそれをチェック:

if (allowedChars.IsMatch(mTextBoxUserName.Text.Trim())) 

問題があれば、私は、不良を書くことです許可された文字と一緒に、if文が一致すると考えます。私はそれを単語全体と一致させたい。私は式の最後に "+"を追加しようとしましたが、それは決して一致しませんでした...

アイデア?

+1

'\"を簡略化するために '@" "リテラルを使うべきです – SLaks

答えて

5

2つのこと:

  1. をあなたの文字列が誤っています@は文字列の前ではなく文字の内側です。これはコピー貼り付けエラーであったか、されていない可能性があります。

    // put the @ outside the "" 
    new Regex(@"[\wåäö§½!""@#£¤$%&/{()=}?\\[\]+´`^¨~'*,;.:\-_<>|]"); 
    
  2. あなただけ許可された文字のはむしろのみ許可文字より、存在していることをチェックしています。あなたはこの問題を解決するために固定して繰り返し使用することができます。

    // anchor using^and $, use []+ to ensure the string is ONLY made 
    // up from that character class. Also move the - to be the last symbol 
    // to avoid inadvertent ranging 
    new Regex(@"^[\wåäö§½!""@#£¤$%&/{()=}?\[\]+´`^¨~'*,;.:\\_<>|-]+$"); 
    
6

正規表現^[...]+$をアンカーする必要があります。

+0

そして一致することができる' $ 'と'^'文字をエスケープしてください。 – vcsjones

+1

@vcsjones:どういうことですか? – SLaks

+1

nevermind、式の後ろに^と&文字がありますが、文字セットの中にありますので問題はありません。 – vcsjones

2

文字列の先頭から@を取り除いてください。あなたのC#に相当する正規表現は正しくありません。

@接頭辞は引用符の外側にあり、\文字は文字列のエスケープ文字ではなくリテラルとして扱われることを意味します。

また、私はあなたがあなたの正規表現を固定すべき場合は、のみ使用可能な文字で構成されている文字列にマッチしたい推測:^[regexHere]+$

2

あなたはすぐに最初の[次^入れることができます。つまり、セットに含まれていない文字と一致します。リストにない文字が含まれている文字列の場合、IsMatchはTrueを返します。したがって、有効な文字列に対してFalseを返します。

文字列が有効かどうかを調べる代わりに、文字列が無効かどうかを確認します。

+0

+1、素敵なアプローチ。 – user7116

関連する問題