用于匹配 3 个字母和 1-2 个数字的正则表达式

RegEx for matching 3 alphabets and 1-2 digits

我正在尝试编写正则表达式以在至少包含 100 个字符的文本中查找匹配项。匹配应该是这样的 - 字符串中的任何子字符串至少包含 3 个字母开头,后面至少有 1 个数字,3 个字母后面最多有 2 个数字。

示例 -

  1. abcjkhklfdpdn24hjkk - 在这种情况下我想提取 pdn24

  2. hjdksfkpdf1lkjk - 在这种情况下我想提取 pdf1

  3. hjgjdkspdg34kjfs dhj khk678jkfhlds1 - 在这种情况下我想要 pdg34 和 lds1

如何为此编写正则表达式?匹配的起始字母长度始终为 3,数字长度可以是 1 或 2(不多也不少)

如果在 3 个字母的字符串后有 2 个数字,这就是有效的方法。

[A-Za-z]{3}[0-9]{2}

但是数字的长度可以在 1 到 2 之间变化。如何在正则表达式中包含变化的长度?

至少 3 个字母:[a-zA-Z]{3,} 1 或 2 位数字(不多不少):[0-9]{1,2}

这给了我们:

/[a-zA-Z]{3,}[0-9]{1,2}/

我们要设计的表情很有意思。我们可以先在捕获组中添加稍作修改的原始表达式,然后我们应该考虑它周围的左右边界。例如,在右边我们可能想使用 \D:

([A-Za-z]{3}[0-9]{1,2})\D

DEMO 1

我们当然可以定义一个精确的限制表达式。然而,这可能只是工作。


根据Cary Swoveland的建议,我们也可以使用这个表达式,这样更好:

\p{L}{3}\d{1,2}(?!\d)

测试

re = /([A-Za-z]{3}[0-9]{1,2})\D/m
str = 'abcjkhklfdpdn24hjkk
hjdksfkpdf1lkjk
hjgjdkspdg34kjfs dhj khk678jkfhlds1 '

# Print the match result
str.scan(re) do |match|
    puts match.to_s
end

此脚本展示了捕获组的工作原理:

const regex = /([A-Za-z]{3}[0-9]{1,2})\D/gm;
const str = `abcjkhklfdpdn24hjkk
hjdksfkpdf1lkjk
hjgjdkspdg34kjfs dhj khk678jkfhlds1 `;
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}`);
    });
}