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

时间:2011-04-16 19:27:10

标签: c# regex split match

我想针对正则表达式验证输入字符串,然后将其拆分。

输入字符串可以是字母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

5 个答案:

答案 0 :(得分:2)

 Regex regex = new Regex(@"^(A!|A)+$");   

编辑:

使用类似http://gskinner.com/RegExr/的内容来播放正则表达式

评论后编辑:

好的,你已经让它更清楚了你想要什么。不要那样接近它。因为在你正在做的事情中,你不能期望匹配整个输入然后分割,因为它将是整个输入。对分割部分使用单独的正则表达式,或使用组来获取匹配的值。

示例:

        //Initial match part

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

        return regex2.Split(s);

而且,正则表达式并不总是答案。了解这可能会对您的应用程序产生什么影响。

答案 1 :(得分:2)

看起来像正则表达式是一个很好的计划。看看这个:

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语句中编写逻辑,这些语句编译和运行的速度更快,成本更低。此外,Regex不太适合重复无限长度字符串的模式。你最终会写一个长的正则表达式或难以理解的东西。

EDIT 在我的代码结束时,您将拥有一个List<string>,其中包含您问题中的拆分输入字符串。或者是空List<string>。如果该要求对您非常重要,您可以稍微调整它以抛出ArgumentException。或者,您可以在列表中执行Count以查看它是否成功。

答案 2 :(得分:1)

您可以尝试以下方式:

Regex regex = new Regex(@"^[A!]+$");

答案 3 :(得分:1)

((A+!?)+)

尝试使用Espresso http://www.ultrapico.com/Expresso.htm或Rad Software正则表达式设计器http://www.radsoftware.com.au/regexdesigner/来设计和测试RE。

答案 4 :(得分:1)

我有一个满足所有例子的解决方案。我不得不把它分成两个正则表达式(我不喜欢)......

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 - 删除空匹配。