数字分组正则表达式

时间:2011-02-18 21:35:59

标签: javascript regex

我有以下正则表达式:

\b((?:12345)(\d{1,4})1)\b

我正在尝试做的是使数字的结尾必须始终为1,无论数字的范围或数字选择如何。我很难搞清楚如何绕过像 12345 111 1 这样的例子,(注意:我已将分组的数字分开以避免混淆)。我怎样才能使正则表达式能够告诉范围组中的数字除了组后面的'1'?谢谢你的帮助。

更新:

没有特定的编程语言,正则表达式存储在数据库中,并被Javascript拉出并用作参考检查。

更新:

澄清的一些例子:

- 用户输入 1234511 ,正则表达式引擎如何知道这是否有效?即引擎如何知道它是否有效 12345 1 1 (一个'1'带有所需的结尾'1')或无效 12345 11 (1的组是正则表达式(\d{1,4})部分的一部分,但字符串末尾不包含“1”

- 用户输入 1234510111 ,这将有效。 12345 1011 1 ('1011'是小组(\d{1,4})的一部分)并在最后包含1。

要点:

正则表达式必须识别1-4范围内的任何数字组,但字符串必须始终以1

结尾

2 个答案:

答案 0 :(得分:3)

正则表达式已将这些数字捕获到捕获组中:

var str = "123459991";
var match = str.match(/\b((?:12345)(\d{1,4})1)\b/);

alert(match[2]); // 999

捕获组是你的正则表达式的括号。

  • 默认情况下,小组0的整个匹配 (对于每个正则表达式始终为matches[0]
  • 第1组是((?:12345)(\d{1,4})1),这是整个匹配(不太有用)。
  • 第2组是(\d{1,4}),这是您要查找的数字。
  • 12345 被捕获到某个群组 - (?...)非捕获群组,并且未包含在结果中的标记。同样,这不会增加太多,你可以简单地写12345

您可以将正则表达式简化为/\b12345(\d{1,4})1\b/,而不会丢失任何信息。

如何匹配:
通常,记住正则表达式引擎尝试很难匹配您的输入非常重要。具体来说,它会尝试所有组合(以及所有可能的起始位置),直到它可以将模式与文本匹配为止 例如,如果文本是1234599991,则匹配很容易:

  • 匹配12345(当然,逐个字符)
  • 匹配\ d {4}对抗9999
  • 匹配1

下一个例子:123459991

  • 匹配12345
  • 匹配\ d对9
  • 匹配\ d对9
  • 匹配\ d对9
  • 匹配\ d对1
  • 尝试匹配1,但失败(它已被\ d {4}消耗)
  • 回溯最后匹配的字符:
    • no \ d {1,4}匹配999
    • 1可以匹配。
  • 进行。

另请参阅:BacktrackingGreediness and Laziness

答案 1 :(得分:0)

看看this看看它是否达到了你想要的效果。

var regex = /^(([0-9]{5})([0-9]{1,4})(1))$/i;
var match1 = "1234511111".match(regex);
var match2 = "123451111".match(regex);
var match3 = "12345111".match(regex);
var match4 = "1234511".match(regex);
var match5 = "123451".match(regex);

console.log(match1);
console.log(match2);
console.log(match3);
console.log(match4);
console.log(match5);