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

本文关键字:分割 字符串 正则表达式 | 更新日期: 2023-09-27 17:50:33

我想根据正则表达式验证输入字符串,然后拆分它。

输入字符串可以是字母A和字母A加感叹号的任意组合。例如,这些是有效的输入字符串:A, A!啊,啊,啊!,一个!一个,! !aaa, aaa !, AA !一个,一个!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!",函数应该抛出一个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;
}

Regex不是一个好计划的原因是,你可以用几个简单的if语句来编写逻辑,这些语句的编译和运行速度更快,成本更低。此外,对于无限长度的字符串,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软件正则表达式设计器http://www.radsoftware.com.au/regexdesigner/来设计和测试正则表达式。

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

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