添加已存在正则表达式的另一个条件

时间:2014-01-30 08:02:09

标签: javascript

我只是尝试构造一个正则表达式,以允许负和非负整数值。它工作正常,

var regex = new RegExp('^[-]?\\d+$');

但现在我很难再添加两个约束,即允许使用小写a,并且总数应小于或等于2且大于或等于{{ 1}}。任何人都可以帮助我实现这一目标吗?

DEMO of what i have tried

1 个答案:

答案 0 :(得分:1)

首先,在JavaScript中,通常最好使用正则表达式的字面形式而不是字符串,因为您不必进行双重转义。它不那么令人困惑。

所以你的文字rex是:

var regex = /^[-]?\d+$/;

在我们添加条件之前:字符类[-]没有意义,只需匹配一个字符-

var regex = /^-?\d+$/;
// Here ------^

你说你想在那里允许a,所以你需要一个角色类:

var regex = /^-?[a\d]+$/;
// Here --------^^^^^

你说你希望长度为1-2个字符。我将假设不包括可选的-,因此您需要一个不同的量词:

var regex = /^-?[a\d]{1,2}$/;
// Here -------------^^^^^

这是正则表达式彻底解释的:

  • ^在字符串

  • 的开头断言位置
  • -?字面匹配字符-

    • 量词:在零到一次之间,尽可能多次,根据需要回馈[贪心]
  • [a\d]{1,2}匹配下面列表中的单个字符

    • 量词:1到2次,尽可能多次,根据需要回馈[贪心]

    • a文字字符a(区分大小写)

    • \d匹配数字[0-9]

  • $断言字符串末尾的位置

Live Copy


根据您的评论:

  

如何将其更改为接受a或数字,这意味着不能同时接受两者。包括 - 符号长度应小于2。

所以你说-a是一个有效的输入,而aa是一个有效的输入,但不是-aa(因为它太长了)。

因为你需要根据-是否存在来应用不同的量词,所以你可能最好选择交替(|):

var regex = /^(?:(?:-[a\d])|(?:[a\d]{1,2}))$/

我们需要非捕获组((?:...)),因为替换适用于最广泛的条件,我们希望^$在交替之外。

Explained

  • ^在字符串

  • 的开头断言位置
  • (?:(?:-[a\d])|(?:[a\d]{1,2}))非捕获组

    • 第一种选择:(?:-[a\d])

      • (?:-[a\d])非捕获组

        • -字面匹配字符-

        • [a\d]匹配下面列表中的单个字符

          • a文字a(区分大小写)

          • \d匹配数字[0-9]

    • 第二种选择:(?:[a\d]{1,2})

      • (?:[a\d]{1,2})非捕获组

        • [a\d]{1,2}匹配下面列表中的单个字符

          • 量词:1到2次,尽可能多次,根据需要回馈[贪心]

          • a文字a(区分大小写)

          • \d匹配数字[0-9]

  • $断言字符串末尾的位置