如何结合消极和正面的正则表达式?

时间:2016-07-10 22:42:54

标签: javascript regex

我认为可以定义一个RegExp字符串来检查两件事 - 用户是不是试图进入邮政信箱,以及用户是否只使用有效字符。两个单独的RegExp如下:

PO BOX验证:

^((?!^.*(\b[Pp]([Oo0][Ss][Tt])?\.*\s*[Oo0]([Ff][Ff]([Ii][Cc][Ee])?)?\.*\s*([Bb][Oo0][Xx])\d*\s*\b.*)).)*$

用户可以输入以下字符:

^[a-z|A-Z|0-9 _&'/#]*$

当我尝试简单地将两个正则表达式与一个垂直的“OR”字符“|”连接在一起时,它无法实现所需的结果。这甚至可能吗?一个正则表达式可以实现两种验证吗?

1 个答案:

答案 0 :(得分:1)

如果您使用自己的正则表达式进行组合,您应该注意到第一个正则表达式实际上是一种带有一种形状不良的驯化贪婪令牌的模式。

似乎你想要像

这样的东西
/^(?!.*\b[Pp]([Oo0][Ss][Tt])?\.*\s*[Oo0]([Ff][Ff]([Ii][Cc][Ee])?)?\.*\s*([Bb][Oo0][Xx])\d*\s*\b)[a-zA-Z0-9 _&'\/#]*$/
                                                                                                ^^^^^^^^^^^^^^^^^^

请参阅regex demo

请注意,[a-z|A-Z|0-9 _&'/#]不应包含|,因为它们被视为文字管道符号,而您最有可能将它们用作OR运算符。它们是括号内的OR运算符,但不在字符类中。

模式详情

  • ^ - 字符串开头
  • (?!.*\b[Pp]([Oo0][Ss][Tt])?\.*\s*[Oo0]([Ff][Ff]([Ii][Cc][Ee])?)?\.*\s*([Bb][Oo0][Xx])\d*\s*\b) - 如果匹配中的模式匹配
  • ,则会导致匹配失败
  • [a-zA-Z0-9 _&'/#]* - 零个或多个允许的字符
  • $ - 字符串结束。

由于[a-zA-Z0-9_] = \w,您可以将其写为

/^(?!.*\b[Pp]([Oo0][Ss][Tt])?\.*\s*[Oo0]([Ff][Ff]([Ii][Cc][Ee])?)?\.*\s*([Bb][Oo0][Xx])\d*\s*\b)[\w &'\/#]*$/