使用正则表达式匹配和分割字符串
本文关键字:分割 字符串 正则表达式 | 更新日期: 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来删除空匹配