正则表达式,可匹配3个字母和1-2个数字

时间:2019-05-23 23:11:37

标签: regex ruby regex-lookarounds regex-group regex-greedy

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

示例-

  1. abcjkhklfd pdn24 hjkk-在这种情况下,我要提取pdn24

  2. hjdksfk pdf1 lkjk-在这种情况下,我要提取pdf1

  3. hjgjdks pdg34 kjfs dhj khk678jkfh lds1 -在这种情况下,我需要pdg34和lds1

如何为此编写正则表达式?一场比赛的开始字母的长度始终为3,数字长度可以为1或2(不多于不少)

如果3个字母的字符串后有2位数字,则此方法有效。

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

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

2 个答案:

答案 0 :(得分:3)

我们希望设计的表达式非常有趣。我们可以先在捕获组中稍加修改后添加您的原始表达式,然后再考虑其周围的左右边界。例如,在右边我们可能要使用\D

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

DEMO 1

我们当然可以定义一个确切的受限表达式。但是,这可能会起作用。


根据Cary Swoveland的建议,我们还可以使用此表达式,该表达式要好得多:

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

enter image description here

测试

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}`);
    });
}

答案 1 :(得分:2)

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

这给我们:

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