如何匹配整个表达式,即使有子部分匹配?

时间:2013-12-09 14:59:30

标签: regex

只是尝试编写允许输入野生字符的输入验证模式。输入字段最大为9 char,应遵循以下规则:

 * + 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*

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

2 个答案:

答案 0 :(得分:3)

使用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}总是多余的 - 每个标记一个匹配是默认值。

答案 1 :(得分:-1)

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

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})$