用正则表达式匹配和分割字符串

| 我想针对一个正则表达式验证输入字符串,然后将其拆分。 输入字符串可以是字母A和字母A后跟感叹号的任意组合。例如,以下是有效的输入字符串:A,A !、 AA,AA !、 A!A,A!A !、 AAA,AAA !、 AA!A,A!AA,...任何其他字符都应产生无效的比赛。 我的代码可能看起来像这样:
public string[] SplitString(string s)
{
    Regex regex = new Regex(@\"...\");
    if (!regex.IsMatch(s))
    {
        throw new ArgumentException(\"Wrong input string!\");
    }

    return regex.Split(s);
}
我的正则表达式应如何显示? 编辑-一些例子: 输入字符串\“ AAA \”,函数应返回3个字符串的数组(\“ A \”,\“ A \”,\“ A \”) 输入字符串\“ A!AAA!\”,函数应返回4个字符串的数组(\“ A!\”,\“ A \”,\“ A \”,\“ A!\”) 输入字符串“ AA!b \”,函数应抛出ArgumentException     
已邀请:
Regex似乎不是一个好的计划。看看这个:
private bool ValidString(string myString)
{
    char[] validChars = new char[] { \'A\', \'!\' };
    if (!myString.StartsWith(\"A\"))
        return false;
    if (myString.Contains(\"!!\"))
        return false;
    foreach (char c in myString)
    {
        if (!validChars.Contains(c))
            return false;
    }
    return true;
}

private List<string> SplitMyString(string myString)
{
    List<string> resultList = new List<string>();
    if (ValidString(myString))
    {
        string resultString = \"\";
        foreach (char c in myString)
        {
            if (c == \'A\')
                resultString += c;
            if (c == \'!\')
            {
                resultString += c;
                resultList.Add(string.Copy(resultString));
                resultString = \"\";
            }
        }
    }
    return resultList;
}
正则表达式不是一个好的计划的原因是,您可以用一些简单的if语句写出逻辑,这些if语句可以更快,更便宜地编译和运行函数。另外,Regex不太擅长为无限长度的字符串重复模式。您可能会写长的Regex或难以理解的内容。 编辑 在我的代码结尾,您将有一个带有拆分输入字符串的
List<string>
,如您的问题中所述。或空的
List<string>
。如果该要求对您非常重要,则可以稍作调整以引发ArgumentException。或者,您可以在列表上进行
Count
来查看是否成功。     
 Regex regex = new Regex(@\"^(A!|A)+$\");   
编辑: 使用http://gskinner.com/RegExr/之类的东西来处理正则表达式 评论后编辑: 好的,您已经更加清楚了自己想要什么。不要那样做。因为在执行操作时,您不能期望匹配整个输入然后进行拆分,因为它将像整个输入一样。对拆分部分使用单独的正则表达式,或者使用组获取匹配的值。 例:
        //Initial match part

        Regex regex2 = new Regex(@\"(A!)|(A)\");

        return regex2.Split(s);
同样,正则表达式并不总是答案。了解这可能如何影响您的应用程序。     
您可以尝试类似:
Regex regex = new Regex(@\"^[A!]+$\");
    
((A+!?)+)
尝试查看Espresso http://www.ultrapico.com/Expresso.htm或Rad Software正则表达式设计器http://www.radsoftware.com.au/regexdesigner/来设计和测试RE。     
我认为我有一个可以满足所有示例要求的解决方案。我不得不将其分成两个正则表达式(我不喜欢)...
public string[] SplitString(string s)
{
  Regex regex = new Regex(@\"^[A!]+$\");
  if (!regex.IsMatch(s))
  {
      throw new ArgumentException(\"Wrong input string!\");
  } 
  return Regex.Split(s, @\"(A!?)\").Where(x => !string.IsNullOrEmpty(x)).ToArray();
}
注意linq的使用-删除空白匹配项是必需的。     

要回复问题请先登录注册