2

たとえば、* の後には & が必要です。例えば、

string asd = "Mother*&Mother*&Son";
// which is "Mother+ "*&" + "Mother" + "*&" + "Son"
// This is correct string.

悪い例、

string asd = "Mother*Mother*&Son";
string asf = "Mother**&Mother*&Son";
string asg = "Mother*&*Mother*&Son";

C#で文字列が正しいかどうかを確認するにはどうすればよいですか?


皆さんが紹介した正規表現の使用法に基づいて編集しますが、補足的な質問があります。実際には、アスタリスク (*) の代わりにカンマ (,) を使用し、アンパサンド (&) の代わりに引用符 (") を使用しています。C# では、(男の例の 1 つを使用させてください)

Regex.IsMatch("Mother,\",Mother,\"Son", @"\,(?!")") 
//won't work.. any idea? 

私も試しました

Regex.IsMatch("Mother,\",Mother,\"Son", @"\,(?!\")") 
//not work, neither
4

4 に答える 4

5

*アンパサンド ( &)が続かないアスタリスク ( ) を探して、失敗を見つけます。

Regex.IsMatch("Mother*&*Mother*&Son", @"\*(?!&)")
于 2013-10-24T17:56:49.543 に答える
2

正規表現を使用できます。ただし、文字列が正しくない場合は見つけやすくなり、結果を否定するだけです。

*が続かないものを探します&。正規表現は次のようになります。(\*[^&])|(\*$)

簡単なテスト コード:

var inputs = new[] {
    "Mother*&Mother*&Son",
    "Mother*Mother*&Son",
    "Mother**&Mother*&Son",
    "Mother*&*Mother*&Son",
    "Mother*&Mother*&Son*"
};

var regex = new Regex(@"(\*[^&])|(\*$)");

var isOK = inputs.Select(x => !regex.IsMatch(x)).ToList();

truefalsefalsefalse、を含む結果のリストを返しますfalse

于 2013-10-24T17:56:19.910 に答える
1

このようなものについては、正規表現を使用するよりも、直接的なアプローチを好みます。これにより、文字列全体で最大 1 回のパスが作成され、正規表現よりも効率的になります。

/// Return true if every instance of 'a' in the string is followed by 'b'. 
/// Also returns true if there are no instances of 'a' in the string.
/// Returns false if there exists any 'a' that is not followed by 'b'.
public static bool IsTwoCharSequence(string s, char a, char b)
{
    if(String.IsNullOrEmpty(s)) return true;
    if(s[s.Length - 1] == a) return false; // ends in a, not followed by b. Condition failed.

    int index = s.IndexOf(a); // find the first a
    while(index != -1)
    {
        if(s[index + 1] != b) return false; // a not followed by b.
        index = s.IndexOf(a, index + 1);
    }

    return true; // either no a, or all a followed by b.
}

編集:さらに、正規表現内の特殊文字でもある場合、区切り文字を引用する方法について心配する必要はありません。


編集 2: はい、2 つのループですが、各ループが何をしているかを見てください。

String.IndexOf の内部にある内側のループは、渡された文字が見つかるまで文字を反復処理します。IndexOf (while ループの外側の呼び出し) への最初の呼び出しは、文字列の先頭から検索を開始し、後続の呼び出しはそのインデックスから開始し、次の一致または最後まで検索を続けます。全体として、文字列全体で 1 回だけパスを作成しました。

上記の方法と概念が似ている別の方法を次に示しますが、「文字列全体を 1 回だけ反復する」ことがより明示的です。

public static bool IsTwoCharSequence(string s, char a, char b)
{
    if (String.IsNullOrEmpty(s)) return true;

    bool foundA = false;

    foreach (char c in s)
    {
        if (foundA && c == b)
            foundA = false;
        else if (foundA)
            return false;
        else if (c == a)
            foundA = true;
    }

    if (foundA) return false; // 'a' was the last char in the string.

    return true;
}
于 2013-10-24T18:14:58.193 に答える
0

正規表現を使用して、*& の一致数が *s の数と同じであることを確認します

頭のてっぺんのコード、コンパイルできないかもしれませんが、試してください:

Regex r = new Regex(@"\*&");
Regex r2 = new Regex(@"\*");
if (r.Matches(myString).Count == r2.Matches(myString).Count) //success!
于 2013-10-24T17:54:00.753 に答える