【问题标题】:Multiple Conditions in Validation Regex验证正则表达式中的多个条件
【发布时间】:2014-09-15 08:22:42
【问题描述】:

我或多或少是个正则表达式新手。我试图将以下条件放入正则表达式:

  • 字符串开头和结尾没有空格
  • 允许所有数字
  • 允许空格、点、括号、加号和减号

导致以下正则表达式:

^\S[\d\/. ()\-+]*\S$

但现在我尝试再应用两个条件:

  • 只允许一个或两个 +
  • 只允许一个(和一个)

我的问题是如何将这两个条件合并到上面的现有正则表达式字符串中,因为不包括 + [+]{1,2} 和 () [(]{1} [)]{1} 没有多大意义,因为我尝试以没有特定顺序的一般陈述,以便我将能够链接它。谢谢拉尔夫

【问题讨论】:

  • 你想阻止)301( 269-3451(所以左括号必须在右括号之前),你想禁止(301 269-3451(打开而不关闭,或者相反地关闭而不打开,尽管这可能在打开之前被抓住)。字符串可以以减号或点开头吗? (+- . -+) 是否有效?你为什么不说不是?您的^\S 允许以任何字母开头;这可能不是你想要的。另外,您打算使用哪些正则表达式子类? PCRE 的答案不同于 awksed 或 ...

标签: regex regex-negation regex-lookarounds


【解决方案1】:

首先,摆脱那些\S,他们错了。每一个都将匹配 任何 非空白字符,因此,例如,如果我在电话号码的开头放置一个 $,它仍然会匹配。

^[\d\/. ()\-+]+$

现在,让我们添加一些条件,为此,我们可以使用前瞻:

  • 一个或两个+:(?=[^+]*(?:\+[^+]+){0,2}[^+]*$)(不连续且不在字符串末尾)
  • 一个(和一个)(?=[^()]*(?:\([^()]*\))?[^()]*$)

所以表达式变成:

^(?=[^+]*(?:\+[^+]+){0,2}[^+]*$)(?=[^()]*(?:\([^()]*\))?[^()]*$)[\d\/. ()\-+]+$

正则表达式101:http://regex101.com/r/xW5pS7/1

这种技术基本上可以让您在相同的匹配字符串上应用多个正则表达式来添加约束。前瞻在末尾有一个 $ 锚点,因此它们都必须匹配整个字符串。

但是我感觉你的要求太宽松了,这个表达式会匹配太多。如果您能想到更精确的规则,我会将它们包含在我的答案中。

【讨论】:

    【解决方案2】:

    使用这个:

    ^(?=\S)(?=(?:[^+]*\+){0,2}[^+]*$)(?=(?:[^(]*\()?[^(]*$)(?=(?:[^)]*\))?[^)]*$)[- .()+0-9]*[-.+()0-9]$
    

    the regex demo 中,您可以使用输入来检查匹配和不匹配的内容。

    说明

    • ^ 锚断言我们位于字符串的开头
    • 前瞻 (?=\S) 断言后面是非空格字符
    • 前瞻 (?=(?:[^+]*\+){0,2}[^+]*$) :最多两个 + 字符
    • 前瞻(?=(?:[^(]*\()?[^(]*$):最多一个(
    • 前瞻(?=(?:[^)]*\))?[^)]*$):最多一个)
    • [- .()+0-9]* 零个或多个允许的字符
    • [-.+()0-9] 以允许的非空格字符之一结尾
    • $ 锚断言我们在字符串的末尾

    参考

    【讨论】:

    • 谢谢,很高兴它有帮助。 :)
    • 非常感谢!完全按计划工作。但我认为我必须通过你的解释才能真正理解一切。一些我还没有看到的新东西。 ;)
    • 我建议您从参考部分的第二篇文章开始,因为解释的速度要舒服得多。该技术是相同的——这类似于密码验证正则表达式。
    • 是的,我已经知道的第一个链接,是几个小时前在研究时遇到的。但是节奏有点太快了。另一个链接似乎更适合我目前的水平。完美的。非常感谢...
    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多