对于这样的事情,我更喜欢直接的方法,而不是使用正则表达式。这将使整个字符串最多通过一次,这应该比正则表达式更有效。
/// 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;
}