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

Posted

技术标签:

【中文标题】正则表达式用于一系列数字和一个用于验证的字符【英文标题】:Regex for a range of numbers and one character for validation 【发布时间】:2019-02-21 13:04:39 【问题描述】:

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

^[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]|1[0-3]|[Qq])$ @WiktorStribiżew : 在正则表达式中到底做了什么?似乎无法找到它的作用。我以前见过一些人使用它。 这是一个非捕获组。 见What is a non-capturing group? What does (?:) do?,还有这个2-min read。 【参考方案1】:

^[1-9][0-3]?|[Q|q]$ 模式匹配从19 的数字,后跟从03 的可选数字,位于字符串的开头(带有^[1-9][0-3]? 部分),或(@987654331 @) 字符串末尾的Q|q(带有[Q|q]$ 部分)。因此,|“拆分”了模式,它的匹配程度超出了您的预期。

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

此外,字符类中的| 与文字| 字符匹配,它失去了alternation operator 的特殊含义。

你可以使用

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

见regex demo

详情

^ - 字符串的开头 (?:[1-9]|1[0-3]|[Qq]) - 分组构造(non-capturing group)(使 ^$ 锚适用于组中的所有备选方案)匹配: [1-9] - 从 19 的数字 | - 或 1[0-3] - 1 然后是从 03 的数字 | - 或 [Qq] - qQ $ - 字符串结束。

【讨论】:

【参考方案2】:

您可以使用以下内容:

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

或者:

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

查看示例:https://regex101.com/r/y6htBi/1

【讨论】:

你犯了和OP一样的错误。 这和帖子做的一样。 不,看demo,15不匹配。 删除了反对票,您最初没有进行分组。现在这将起作用。

以上是关于正则表达式用于一系列数字和一个用于验证的字符的主要内容,如果未能解决你的问题,请参考以下文章

用于密码验证的正则表达式 Java

用于验证 int 范围字符串的正则表达式

用于密码验证的正则表达式

用于验证特定模式的正则表达式

用于密码验证的正则表达式 [重复]

用于文本框验证的 HTML5 正则表达式模式:仅允许字母、空格和某些字符