验证正则表达式中的多个条件

问题描述 投票:0回答:2

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

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

产生以下正则表达式:

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

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

  • 仅允许一两个+
  • 仅允许一个(和一个)

我的问题是如何将这两个条件合并到上面现有的正则表达式字符串中,因为排除 +

[+]{1,2}
和 ()
[(]{1} [)]{1}
没有多大意义,因为我试图以没有特定顺序的一般语句,以便我可以把它链接起来。

regex regex-negation regex-lookarounds
2个回答
8
投票

使用这个:

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

正则表达式演示中,您可以使用输入来检查哪些匹配,哪些不匹配。

解释

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

参考


1
投票

首先,摆脱那些

\S
,它们是错误的。每个都将匹配 any 非空白字符,因此,如果我在电话号码的开头放置
$
,它仍然会匹配。

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

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

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

因此表达式变为:

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

Regex101:http://regex101.com/r/xW5pS7/1

这种技术基本上可以让您在同一匹配字符串上应用多个正则表达式来添加约束。前瞻末尾有一个

$
锚点,因此它们都必须匹配整个字符串。

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

© www.soinside.com 2019 - 2024. All rights reserved.