【问题标题】:How to match the whole expression only, even when there are sub parts that match?即使有匹配的子部分,如何仅匹配整个表达式?
【发布时间】:2013-12-09 14:59:30
【问题描述】:

只是尝试编写允许输入通配符的输入验证模式。输入字段最多 9 个字符,应遵循以下规则:

 * + 1- 8 charcters
 1- 8 chars + *
 * + 1-7 chars + *

我已经使用正则表达式文档编写了这个正则表达式,并在其中一个正则表达式测试器上对其进行了测试。

\*{1}[0-9]{1,7}\*{1}|[0-9]{1,8}\*{1}|\*{1}[0-9]{1,8}|[0-9]{9}

所有这些都正确匹配

123456789
*1*
*12*
*123*
*1234*
*12345*
*123456*
*1234567*
1234567*
123456*
12345*
1234*
123*
12*
1*
*1
*12
*123
*1234
*12345
*123456
*1234567
*12345678

但是当我不想要它时它也匹配。例如,它在此 *123456789* 中找到 2 个匹配项,第一个匹配项是 *12345678,第二个匹配项是 9*

在这种情况下,我不想找到任何匹配项。整个字符串要么匹配其中一个模式,要么不匹配。如何做到这一点?

【问题讨论】:

  • 您使用的是什么正则表达式风格,不需要您转义星号?
  • 抱歉,复制粘贴错误
  • 这里是编写正则表达式的好工具。 debuggex.com

标签: regex


【解决方案1】:

使用anchors 确保正则表达式始终匹配整个字符串:

^(\*[0-9]{1,7}\*|[0-9]{1,8}\*|\*[0-9]{1,8}|[0-9]{9})$

注意括号以确保替换包含在组中:

^
(
 \*[0-9]{1,7}\*
|
 [0-9]{1,8}\*
|
 \*[0-9]{1,8}
|
 [0-9]{9}
)
$

另外,{1} 总是多余的 - 每个令牌匹配一个是默认设置。

【讨论】:

    【解决方案2】:

    您可以使用开始和结束字符串锚点:

    http://www.regular-expressions.info/anchors.html

    所以,你的正则表达式应该是这样的(注意第一个和最后一个符号):

    ^(\*{1}[0-9]{1,7}*{1}|[0-9]{1,8}*{1}|*{1}[0-9]{1,8}|[0-9]{9})$
    

    【讨论】:

    • 这将无法正常工作。您需要使用括号来限制交替的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2013-10-12
    • 2023-01-10
    相关资源
    最近更新 更多