2016-10-01 8 views
0

正規表現の使用が必要なのは、正規の型付き文字ではない文字列に文字が存在する場合に真/偽を返します。これは簡単なことではありませんか?Microsoft asp C#RegEx複数の予約文字をエスケープ

私はパターンがありません、私はちょうどリストにない文字が存在するかどうか知りたいです。単に通常の正規表現の世界では

私は:

[^0-9a-zA-Z~`[email protected]#$%\^ &*()_-+={\[}]|\\:;\"'<,>.?/] // <space> before the ampersand 

...私は少し肥大化した知っているが、この記事のためにポイントを作る...

私はあなたが複数の予約を免れることはできない見つけます文字。 たとえば、正規表現の元= Regex.Escape( "[")+ Regex.Escape( "^")は、上にヒットしません。 "ST [前夜" または "ST ^まし" 以下は失敗のように

を:

string ss = Regex.Escape("[") + Regex.Escape("^"); 
    Regex rx = new Regex(ss); 
    string s = "st^eve"; 
    rx.IsMatch(s)); 

これらのいずれかの意志のように:

string ss = Regex.Escape("[") + "[0-9]"; 
    Regex rx = new Regex(ss); 
    string s1 = "st^eve"; rx.IsMatch(s1)); 
    string s2 = "st^ev0e; rx.IsMatch(s2)); 
    string s3 = "stev0e; rx.IsMatch(s3)); 

しかし、これは、マイクロソフトのC#の正規表現の使用のみが失敗しない文字のエスケープです:

string ss = Regex.Escape("^"); 
    Regex rx = new Regex(ss); 
    string s = "st^eve"; rx.IsMatch(s)); 
0を

エスケープに必要な各文字の個別のテストを開発する必要がありますか?エスケープされていない文字のテストに追加しますか?

これは他の人々がやっていることですか?

もっと良い方法があればアイデアは公開されていますか?

ありがとうございました。

答えて

0

@PMVへの最初のおかげです。彼は私に一連のテストをするよう促した。

これは明らかに実際の動作です。

私が何を試しても、二重引用符も一重引用符も取得できませんでした。そしてそれは実際には 'C'言語に戻って考えることを理にかなっています。

注:.Escape()を使用するようにしているに何場合は行いません。 IMOは文字列を作成する関数を使用する必要があります= "\ ["あなたはとにかく馬鹿です。 .Escape() is not necessary on^nor { nor ] nor \ nor " nor '

string ss = "[0-9A-Z~`[email protected]#$%^& *()-_+={[}]|\\:;<,>.?/"; 
     // does not match ~ ss = ss + Regex.Escape("\""); 
     // does not match ~ ss = ss + Regex.Escape("\'"); 
    ss = ss + "]"; 

    Regex rx = new Regex(ss); 
     // rx = new Regex("[" + Regex.Escape("\"") + "]"); 
     // works just as well as the line above ~ rx = new Regex("[\"]"); 
     // rx = new Regex("[" + Regex.Escape("'") + "]"); 
    rx = new Regex("[']"); 

    string s = "ste've"; 
    Console.WriteLine("search string {0}", ss); 
    Console.WriteLine("IsMatch {0}", rx.IsMatch(s)); 

とてもすごく近いです。

0

表現として生成しているものについて考えてみましょう。あなたの例正規表現

string ss = Regex.Escape("[") + Regex.Escape("^"); 

は同等です:

ある
string ss = @"\[\^"; 

、それは[または^を探していない、それは^続い[を探しています。したがってste[^veは一致します。ある

string ss = "[" + Regex.Escape("[") + Regex.Escape("^") + "]" 

、あなたは次のような

あなたは文字の一つ以上を含む任意の文字列を一致させたい場合は、文字のセットを作成するための(非エスケープ)ブラケットを追加する必要があり、 Regexエンジンに括弧内の文字セット内の1文字を探すように要求しています。

+0

'Regex.Escape(" - ")'は " - "なので、これまでのコードは回答のための良いスタートステップですが、完全な答えではありません。 –

+0

@PMVこんにちは、ありがとう。あなたの発言を少し深く掘り下げて見ると、Regex.Escape( "[")は単に "\ ["と同じです。ですから、 "\ ["を使用すると思うでしょう。これは失敗します: 'regex reg = new Regex( "regex.Escape(") ")") ")");文字列str = "s \" t [ev0e ";'これは失敗します: 'Regex reg = new Regex( "Regex.Escape(" \ "")+ Regex.Escape( ")")+ "]") ")これがないと、 'Regex reg = new Regex( "[\"] ");'私はダムの男ではないが、これは少し不安定なようだ。たぶん、不安定な言葉が良いです。私は数を組み合わせたり、数多くのテストを組んでいます。私は私が必要なものを手に入れることができるのが分かります。 – Steve

関連する問題