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#中,(让我使用其中一个人的例子)

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();

返回结果列表,其中包含true, false, false, false, false

于 2013-10-24T17:56:19.910 回答
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:是的,这是两个循环,但看看每个循环在做什么。

内部循环,即 String.IndexOf 内部的循环,将遍历字符,直到找到传入的字符。第一次调用 IndexOf (在 while 循环之外)从字符串的开头开始搜索,随后的调用从该索引开始,并继续搜索到下一个匹配项或结尾。总的来说,我们只对整个字符串进行了一次传递。

这是另一种方法,在概念上与上述方法相似,但“仅迭代整个字符串一次”更为明确。

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 回答