正则表达式表示一系列数字和一个字符用于验证



我正在尝试使用正则表达式来验证用户对我正在处理的项目的输入。我目前使用的模式是

^[1-9][0-3]?|[Q|q]$ //Range of 1-13 or Q|q (Can't include 0)

根据 Regex101.com,它显示用户输入(例如 15(不是匹配项,但是当我运行项目时,它就像匹配项一样。我如何将此正则表达式限制为仅接受 1-13 之间的数字范围和字符 Q 或 q?对于上下文,如果我的while循环错误,这里也是该代码。

while (!match.Success)
{
// Ommited Console.WriteLines to for clarity.
FancyArtBottom();
Console.SetCursorPosition(47, 19);
userSelection = Console.ReadLine();
match = Regex.Match(userSelection, @"^[1-9][0-3]?|[Q|q]$");
}

^[1-9][0-3]?|[Q|q]$模式匹配字符串开头的19后跟一个从03的可选数字(带有^[1-9][0-3]?部分(,或 (|( 字符串末尾的Q|q(带有[Q|q]$部分(。因此,|"拆分"模式,并且匹配的比您预期的要多。

此外,如您所见,[1-9][0-3]?匹配的不仅仅是从013的数字。

此外,字符类中的|与文字|字符匹配,它失去了交替运算符的特殊含义。

您可以使用

^(?:[1-9]|1[0-3]|[Qq])$

查看正则表达式演示

  • ^- 字符串的开头
  • (?:[1-9]|1[0-3]|[Qq])- 一个分组构造(非捕获组((使^$定位点应用于组中的所有备选方案(匹配:
    • [1-9]- 从19的数字
    • |- 或
    • 1[0-3]-1,然后是03的数字
    • |- 或
    • [Qq]-qQ
  • $- 字符串的结尾。

您可以使用以下内容:

^(1[0-3]|[1-9]|Q|q)$

或:

^(1[0-3]|[1-9Qq])$

请参阅示例:https://regex101.com/r/y6htBi/1