如何结合两个正则表达式条件?

时间:2016-06-20 16:03:49

标签: javascript regex regex-lookarounds

我正在尝试在JavaScript中编写正则表达式,其中包括两个条件A和B

(A)(B)显然不是有效的解决方案。

我的两个正则表达式是:

^((?=.*?(.*([\.]).*)[^@])[^@]+)$

^((?!\.\.).)*$


所以 ^((?=.*?(.*([\.]).*)[^@])[^@]+)(((?!\.\.).)*)$不会和两个正则表达式相同

我怎样才能做到这一点 ?是否有一般规则?

3 个答案:

答案 0 :(得分:2)

有时候,没有一种明显的方法可以结合表达式。就像你说的那样,(A)(B)无效。由于正则表达式不是一种编程语言,所以你需要的“明显”方法是:

var doesMatch = string.match(/(A)/) && string.match(/(B)/);

如果没有花时间真正破译你想要匹配的内容,很难说是否有一种非显而易见的方法来组合这两个表达式......我只能说没有通用的规则将它们结合起来。

另外,组合两个正则表达式并不一定意味着它更快。取字符串foo bar和表达式^foobar$。这两个表达式的“明显”组合是^foo.*?bar$;但是,^foobar$分别采取5个步骤,而合并后的版本需要11个步骤。

答案 1 :(得分:1)

您可以将它们组合如下

^(?=.*?(.*([\.]).*)[^@])((?!\.\.)[^@])+$

Regex explanation here.

Regular expression visualization

答案 2 :(得分:0)

尝试将其分解为您正在测试的实际条件;我看到其中三个:

  • 包含至少一个点(.
  • 不包含双点(..
  • @
  • 之外的任何字符中的一个或多个

将其中两个转换为前瞻,然后将所有三个链接到一个正则表达式。那将是:

^(?=.*\.)(?!.*\.\.)[^@]+$

但也许你想确定它不会以点开头或结尾。 没有前瞻更容易做到:

^[^@.]+(?:\.[^@.]+)+$