2010-12-02 5 views
2

私が確認したい複数行のテキストボックス(テキストエリア)に特定の文字列があります。私は試していた:RegularExpressionValidatorが複数行のテキストボックス(テキストエリア)で遅い

<asp:RegularExpressionValidator runat="server" ControlToValidate="txtTemplate" ValidationExpression="^(.\s*)*Content(.\s*)*$" Text="content" ErrorMessage="Must contain: Content" /> 

を使用している^(.\s*)*$は、テキストエリアのようです。だから私はこれらの2つの間に自分の基準を挟むようにしました。しかし、それはIEとクロムの両方をロックアップするようだ。

これは簡単なはずです。私はそれが必要以上に厳しいものになっていると思います。

答えて

4

をお試しください:

(?s)^.*Content.*$ 

(?s)は、Singlelineモードを有効にします。.メタ文字は、改行を含むすべての文字と一致します。あなたはそれが同様にクライアント上で実行したい場合は、これを使用する:JavaScriptをもDOT_ALLDOTALLドットマッチ-すべてシングルとして知られているSinglelineモード(には相当していないためだ

^[\s\S]*Content[\s\S]*$ 

ライン、または/sモード)。 (?s)(?i)のようなインライン修飾子は認識されません。

は、数量詞と式(*+など)自体が数量詞によって制御されている基で囲まれ(.\s*)*、同様に構築するために注意してください。正規表現がすぐに一致することに失敗した場合、それは戻って別のパス(正規表現の異なる部分を使用して文字列の異なる部分に一致させる)で一致するように試みますが、これは非常に高価でパフォーマンスが悪くなります。 .\sが同じ文字の多くにマッチすることができるので、この正規表現は特に悪いことです。これは、あきらめる前に探索しなければならないパスの数を劇的に増やします。

この現象は一般にcatastrophic backtrackingとして知られており、通常、一致する可能性がない場合に現れます。シーケンスContentが存在するとき、あなたのバリデーターがうまく動作することを期待します。 MalContentContentiousのような言葉で偽陽性を防ぐことができます

(?s)^.*\bContent\b.*$ 

:あなたが唯一の完全な単語Contentに一致させたい場合はところで

は、あなたがそうのように、単語の境界を追加する必要があります。 \bは、さまざまな正規表現の味で動作が異なります。 .NETでは、ECMAScriptモードを指定しない限り、Unicode対応です。JavaScriptでは、ASCIIの文字と数字だけを単語文字として認識するはずです。それはほとんどのブラウザではありますが、それは当然のことです。

+0

恐ろしい答えです。クライアント側でも実行したいので([runt = "server"はサーバーがタグを解釈する必要があることを意味し、EnableClientScript = "false"はサーバー上でのみ実行する)ので、[\ s \ S] 。 – Eric

0

もっと正規表現.*Content.*の方がより効果的で高速になると思います。また、JavaScriptが文字列のテキストを検索するパフォーマンスドラッグである場合は、カスタムバリデーターを実装することもできます。

+0

動作しません。ピリオドは改行をキャッチしないので、 "\ s"(空白)を含めています。私はカスタムバリデーターを行うことができますが、これは8行のコードのようです:) – Eric

1

検証は常に(それが何runat="server"手段だ、それはないですか?)サーバー上で行われている場合は、最も簡単な解決策は、この正規表現を使用することが考えられます

[\S\s]*Content[\S\s]* 
関連する問題