2

C#の正規表現についてもっと読みたいので、自分の結論を確認したいと思います。次の式「。*[^a-zA-Z0-9 _]。*」の場合、最初と最後の「。*」は役に立たないですよね?私が理解したように、「。*」は文字の出現が0回以上であることを意味しますが、その後に「[^ a-zA-Z0-9_]」が続く場合は、大文字と小文字を区別しない文字と数字の組み合わせ以外の文字を意味します。 「[^a-zA-Z0-9_]」の前後に「。*」を追加しても意味がありませんね。

式が一致するかどうかを確認するために使用しているコードは次のとおりです

// Here we call Regex.Match.
Match match = Regex.Match("anytest#", ".*[^a-z A-Z0-9_].*");
//Match match = Regex.Match("anytest#", "[^a-z A-Z0-9_]");

// Here we check the Match instance.
if (match.Success)
    Console.WriteLine("error");
else
    Console.WriteLine("no error");
4

5 に答える 5

2

唯一の違いは、「マージン文字」が結果に含まれるかどうかです。

にとって:

ab41--_71j

一致します:

1--_7

そして、.*最初と最後がなければ、それは一致します:

--_

.*[^a-zA-Z0-9_].*a-zA-Z0-9_以外の文字が少なくとも1つある限り、どの文字列も正規表現と少なくとも1回一致します。

あなたの答えの現在の最後のコメントから、私はあなたが実際に以下を使用していることを理解しています:

^[a-zA-Z0-9]*$

これは、すべての文字が数字/文字の場合にのみ一致します。一致しない場合、文字列は無効です。

_キャラクターも許可する場合は、次を使用します。

^[a-zA-Z0-9_]*$

これは次のように短縮することもできます。

^\w$

一般に、文字列を無効にするよりも、正規表現の検証を行う方が適切です。それはより理にかなっており、より直感的です。

したがって、私の検証は次のようになります。

if (Regex.IsMatch("anytest#", "^\\w$"))
{
    Console.WriteLine("Success");
}
else
{
    Console.WriteLine("Error");
}

おそらくより速い別のオプション:

if ("anytest#".ToCharArray().All(c => char.IsLetterOrDigit(c) || c == '_'))
{
    Console.WriteLine("Success");
}
else
{
    Console.WriteLine("Error");
}

また、「_」を含めたくない場合は、見栄えを良くすることもできます。

if ("anytest#".ToCharArray().All(char.IsLetterOrDigit))
{
    Console.WriteLine("Success");
}
else
{
    Console.WriteLine("Error");
}
于 2012-06-03T06:26:18.380 に答える
2

.*[^a-zA-Z0-9_].*入力のどこかに非英数字/アンダースコアがある限り、入力全体に一致します。[^a-zA-Z0-9_]入力のどこかにある場合、単一の非英数字/アンダースコア文字 (デフォルトの貪欲なマッチングを使用している場合は最後の文字) のみに一致します。どちらが必要かは、入力と、入力に非英数字/アンダースコア文字が存在するかどうかを確認したら何をしたいかによって異なります。

于 2012-06-03T06:33:20.847 に答える
1

a-Zいいえ、と以外の文字があるため0-9です。

その正規表現は、任意の文字で始まり、その後になく、任意のa-zA-Z0-9文字で終わるすべての文字列に一致します。または、まったく含まれていない文字列だけ です。a-zA-Z0-9

離れると、.*まったく含まれていない文字と一致する正規表現ができます a-zA-Z0-9

.*[^a-zA-Z0-9_].*  matches for instance: ABC_ß_ABC
[^a-zA-Z0-9_]      matches for instance: ß   (and this regex just matches 1 character)
于 2012-06-03T06:18:42.147 に答える
1

実際に探しているトークンのみを正規表現に含めます。あなたの場合、指定した除外文字クラスの前後に他の文字があるかどうかは実際には気にしませんでした。.*その前後に追加しても、一致の成功は変わりませんが、一致がより複雑になります。正規表現は、最初に使用するなど、何らかの方法で具体的に固定しない限り、すでにどこでも一致します^

于 2012-06-03T09:49:40.187 に答える
1

入力 1 :ABC_ß_ABC

入力 2 :ß

正規表現 1:.*[^a-zA-Z0-9_].* 正規表現 2:[^a-zA-Z0-9_]

両方の入力が両方の正規表現に一致し、

入力 1 の場合

正規表現 1 は 9 文字に一致します

正規表現 2 は 1 文字のみに一致します

于 2012-06-03T06:55:48.680 に答える