我想针对正则表达式验证输入字符串,然后将其拆分。
输入字符串可以是字母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);
}
我的正则表达式应该如何?
编辑 - 一些例子:
答案 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 - 删除空匹配。