【问题标题】:Regex for capturing 4 consecutive numbers in an ID用于在 ID 中捕获 4 个连续数字的正则表达式
【发布时间】:2019-05-29 13:30:34
【问题描述】:

我需要一个公式从某个索引开始,然后得到接下来的 4 个连续数字。使用正则表达式。并测试它们是否在0000-4999的范围内。

^.{6}\d{4}$[0000-4999]

这是我尝试过的一些代码。虽然我还是新手,不懂正则表达式。

结果需要如下:

身份证号码:

9202204720082

获取以下4个数字:4720

从索引 7 开始(假设索引从 1 开始)

所以想要获取索引 7、8、9 和 10 的数字。 这样做是为了确定 ID 中的性别。

【问题讨论】:

  • 你用[0000-4999]做什么?使用 ^.{6}(\d{4}) 并获取第 1 组值 否则,如果您的正则表达式支持后向搜索,并且您需要通过各种方式获得整个匹配的结果,请使用 (?<=^.{6})\d{4}
  • 如果你想使用锚点,^\d{6}(\d{4})\d{3}$[0000-4999] 是一个字符类,与[012349] 相同,但在字符串/行的末尾
  • 我已将我的问题更新为更具体。

标签: regex string regex-group regex-greedy


【解决方案1】:

这可能会有所帮助:

(?<=\d{6})\d{4}(?<=\d{3})

您可以在 regex101 链接中查看:Link to Regex

【讨论】:

  • 效果很好,但我如何检查这些值是否在 0000-4999 范围内
【解决方案2】:

你原来的表达就好了,这里我们可以稍微修改一下:

^.{6}(\d{4}).+$

我们正在该组中捕获我们想要的数字(\d{4})

DEMO

const regex = /^.{6}(\d{4}).+$/gm;
const str = `9202204720082`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

正则表达式电路

jex.im 可视化正则表达式:

【讨论】:

    【解决方案3】:

    您不需要为此使用正则表达式。您可以通过简单地获取子字符串来获得相同的结果。根据您的编程语言,您可能会执行以下操作:

    JavaScript

    var string = "9202204720082";
    var index = 6;
    
    console.log(string.substring(index, index + 4));

    红宝石

    string = '9202204720082'
    index = 6
    
    string[index, 4]
    #=> "4720"
    

    Perl

    my $string = '9202204720082';
    my $index = 6;
    
    substr($string, $index, 4);
    #=> "4720"
    

    【讨论】:

    • 很遗憾,我正在使用 Salesforce 验证规则编辑器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多