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

时间:2014-07-23 23:07:58

标签: regex regex-negation regex-lookarounds

我或多或少是一个正则表达式的新手。我试图将以下条件变为正则表达式:

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

导致以下正则表达式:

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

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

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

我的问题是如何将这两个条件合并到上面的现有正则表达式字符串中,不包括+ [+]{1,2}和()[(]{1} [)]{1}并不是很有意义因为我试图在没有特别的顺序,所以我可以链接它。谢谢Ralf

2 个答案:

答案 0 :(得分:6)

使用此:

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

the regex demo 中,您可以使用输入来检查哪些匹配并且没有匹配。

<强>解释

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

<强>参考

答案 1 :(得分:0)

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

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

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

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

因此表达式变为:

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

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

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

但是我觉得你的requiremens太松了,这个表达式会匹配太多。如果你能想到更准确的规则,我会在答案中加入它们。