8

TextBox コントロールの要件は、有効な入力として次を受け入れることでした。

  1. 一連の数字。
  2. リテラル文字列「部屋数」。
  3. まったく値がありません (空白のまま)。値をまったく指定しないと、RegularExpressionValidator が渡されます。

次の RegEx は、望ましい結果をもたらしました (3 種類の入力を正常に検証しました)。

"Number of rooms|[0-9]*"

しかし、「Number of rooms」という文字列が指定されているときに次の検証に失敗する理由を同僚から尋ねられたとき (要件 #2)、説明を思いつくことができませんでした。

"[0-9]*|Number of rooms"

この場合、交互の順序が重要である理由についての説明は、非常に洞察力に富んでいます。

アップデート:

2 番目の正規表現は、ここに示すように、コンソール アプリのターゲット文字列「部屋数」と正常に一致します。ただし、入力が「部屋数」の場合、aspx マークアップで同じ式を使用すると一致しません。関連する aspx マークアップは次のとおりです。

<asp:TextBox runat="server" ID="textbox1" >
</asp:TextBox>

<asp:RegularExpressionValidator ID="RegularExpressionValidator1" 
EnableClientScript="false" runat="server" ControlToValidate="textbox1" 
ValidationExpression="[0-9]*|Number of rooms" 
ErrorMessage="RegularExpressionValidator"></asp:RegularExpressionValidator>

<asp:Button ID="Button1" runat="server" Text="Button" />
4

3 に答える 3

9

Regex エンジンが照合しようとする順序であるため、順序は重要です。

ケース 1:Number of rooms|[0-9]*

この場合、正規表現エンジンは最初にテキスト「Number of room」との一致を試みます。これが失敗した場合は、数字の一致を試みるか、または何も試みません。

ケース 2: [0-9]*|Number of rooms:

この場合、エンジンは最初に数値の一致を試みるか、または何も一致させようとしません。しかし、常に一致するものはありません。この場合、「部屋数」を試す必要はありません。

これは || のようなものです。C# の演算子。左側が一致すると、右側は無視されます。

更新: 2 番目の質問に答えるには。RegularExpressionValidator とは動作が異なります。これは、一致をチェックするだけでなく、それ以上のことを行っているためです。

// .....
Match m = Regex.Match(controlValue, ValidationExpression);
return(m.Success && m.Index == 0 && m.Length == controlValue.Length); 
// .....

一致をチェックするだけでなく、一致の長さが文字列全体であることを確認します。これにより、部分一致または空の一致が除外されます。

于 2012-04-20T15:12:39.673 に答える
2

パターン(スター付き) は常に少なくとも空の文字列 (を意味するため、「ゼロ以上...」を意味します) と一致するため、おそらく正規表現Number of rooms|[0-9]+またはを使用したいと考えていました。[0-9]+|Number of rooms[0-9]**{0,}

于 2012-04-21T00:59:44.600 に答える
2

ポイントは[0-9]*、最初に指定すると、先頭の が空の文字列に一致することです。文字列全体を数字に
するように指定すると、次のように機能します。

^[0-9]*$|Number of rooms

文字列全体が一致する必要があることを示す^andを指定しない限り、空の文字列は "部屋数" の先頭で一致し、その時点で 2 番目の選択肢は試行されません。 これがコメントの質問に答えてくれることを願っています。明確かどうかはわかりません...$

于 2012-04-20T15:13:11.490 に答える