1

これは私が書いた正規表現で、"$"または"^"が渡された場合に true を返します。以下の文字のみが一致するように指定したときに true を返すのはなぜですか

public static bool IsTrue(string test)
{
    Regex regex =  new Regex(@"(([a-zA-Z][0-9a-zA-Z+\\-\\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?");    
    return regex.IsMatch(test);
}
4

2 に答える 2

3

問題は、正規表現のすべての部分がオプションであることです。つまり、空の文字列でも正規表現に一致します。無効な文字列が渡された場合でも、入力の先頭にある長さ 0 の部分文字列と一致します。

また、スラッシュをエスケープしました。これは、逐語的な文字列リテラル ( で始まる文字列リテラル) では必要ありません@。string 通常の文字列リテラル"foo\\bar"は verbatim リテラルと同等@"foo\bar"です。

パターンに開始 ( ) アンカー^と終了 ( ) アンカーを追加する必要があると思います。$

new Regex(@"^(([a-zA-Z][0-9a-zA-Z+\-.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$.\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$.\-_!~*'()%]+)?$");

これは^失敗しますが、空の文字列は引き続き一致し (すべての部分はまだオプションであるため)、$有効な入力です。一致させたいものと一致させたくないものに関する詳細情報がなければ、このパターンを変更する方法を正確に伝えることは困難です。

あなたのコメントによると、単に入力を数文字に制限したい場合は、次のパターンを使用できます。

new Regex(@"^[A-Za-z0-9 '()&#/\\+;:-]*$");
于 2013-08-28T22:00:05.867 に答える
1

試合を見ると、すべてのグループが ? で終わっています。すべてのパーツをオプションにする:

(
    (
        [a-zA-Z][0-9a-zA-Z+\\-\\.]*:
    )?
    /{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+
)?
(
    #[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+
)?

それを確認するために、上記のように再フォーマットする必要がありました。

于 2013-08-28T22:03:37.607 に答える