我正在接受用户输入(字符串)并根据3种不同的reg ex模式进行检查。这样做的原因是我们正在进行异步验证,验证功能会在每个键上启动。用户输入字符串连接,因此每次迭代都会更长。
正则表达式应该匹配1到3位数字,然后是空格,然后是1到3位数字。例子:
Correct:
1
12
12 26
123 12
Incorrect
any letter or spec character
any space before a number (space after first set of numbers is ok).
以下功能有效:
static void Main(string[] args)
{
string userInput = Console.ReadLine();
List<string> patternList = new List<string>();
patternList.Add(@"^([0-9])$");
patternList.Add(@"^[0-9]{1,3} $");
patternList.Add(@"^[0-9]{1,3} [0-9]{1,3}$");
ValidateInput(userInput, patternList);
}
private static void ValidateInput(string userInput, List<string> patternList)
{
Regex r = null;
Match m = null;
bool IsMatch = false;
foreach (var p in patternList)
{
r = new Regex(p);
m = r.Match(userInput);
IsMatch = m.Success;
if (IsMatch)
break;
}
if (IsMatch)
{
Console.WriteLine("You wrote: {0} Thats a match", userInput);
Console.ReadLine();
}
else
{
Console.WriteLine("You wrote: {0} Thats NOT a match", userInput);
Console.ReadLine();
}
}
但我希望看看是否可以使用一个表达式(而不是3个)。看起来像是在表达式后面的负面看法,以确保在空格之前有一个数字?
答案 0 :(得分:2)
您根本不需要环视,只需将三个正则表达式压缩为一个:
^([0-9]{1,3})(?: ([0-9]{1,3})?)?$
?:
表示它是非捕获组,因此第一个匹配组将捕获第一个数字,第二个捕获组显然是第二个。
如果两个数字之间的空格序列是任意的(一个或多个空格,制表符,等等),您还可以使用:
^([0-9]{1,3})(?:\s+([0-9]{1,3})?)?$
代替。
显然可以使用Lookahead和lookbehind,但是使事情变得更复杂,更难以解析。此外,在许多情况下,前瞻用于和模式,而不是或模式。 或模式也可以使用析取(|
)来实现。
答案 1 :(得分:1)
这一个表达式会在输入时验证输入(无需环视)。
^[0-9]{1,3}(?:\s[0-9]{0,3})?$