失败的正则表达式

时间:2011-03-16 09:58:25

标签: java regex

我正在用Java编写代码。

我正在尝试编写有效此规则的常规异常:

  • 输入必须只是数字。
  • 输入必须
    • 仅从03或02或08或09或04
    • 开始
    • 之后必须只有1或2或3或7位数字。

示例:

成功输入:

 031, 0822, 097777777

输入失败:

 06, 0622, 09666666, 084444.

我试图这样做,但不能正确。

 ^0([23894]\d{1}|\d{2}|\d{3}|\d{7})

谢谢大家,

射线。

5 个答案:

答案 0 :(得分:2)

你搞砸了分组。尝试

^0[23894](?:\d|\d{2}|\d{3}|\d{7})$

理解原因:

^a(bc|d)$

匹配abcac而非abd

答案 1 :(得分:2)

事情并没有像你期望的那样去,因为你的正则表达式:

^0([23894]\d{1}|\d{2}|\d{3}|\d{7})

实际上意味着:

^0
(
  [23894]\d{1}   // b1
  |              // OR  
  \d{2}          // b2
  |              // OR
  \d{3}          // b3
  |              // OR
  \d{7}          // b4
)

因此它在开始时与0匹配,后跟b1b2b3b4

请改为尝试:

^0[23894](\d{1,3}|\d{7})$

答案 2 :(得分:1)

尝试将其更改为^0[23894](\d{1,3}|\d{7})$(未经测试)。你写的是0,然后是2,3,8,9,4和另一个数字,或两位数,或三位数,或七位数。 {1,3}指定重复范围为1-3次。

$将表达式锚定在字符串的末尾;如果省略它,任何以该模式开头的字符串都将有效。

答案 3 :(得分:0)

这有两个问题:

  1. 你的括号在错误的地方,你应该只在末尾的数字长度上交替
  2. 您需要在结尾处使用“匹配结束字符串”符号以确保它与初始数字相匹配,然后是1/2/3/7其他数字

    试试这个:

    ^ 0 [23894](\ d {1} | \ d {2} | \ d {3} | \ d {7})$

答案 4 :(得分:0)

试试这个:

^0([23894](1|2|3|7)*)