我正在尝试编写一个正则表达式,以查找具有至少100个字符的文本中的匹配项。匹配应该是这样的-字符串中包含至少3个字母开头,其后至少1位和3个字母后最多2位的子字符串。
示例-
abcjkhklfd pdn24 hjkk-在这种情况下,我要提取pdn24
hjdksfk pdf1 lkjk-在这种情况下,我要提取pdf1
hjgjdks pdg34 kjfs dhj khk678jkfh lds1 -在这种情况下,我需要pdg34和lds1
如何为此编写正则表达式?一场比赛的开始字母的长度始终为3,数字长度可以为1或2(不多于不少)
如果3个字母的字符串后有2位数字,则此方法有效。
[A-Za-z]{3}[0-9]{2}
但是数字的长度可以在1到2之间变化。如何在正则表达式中包括变化的长度?
答案 0 :(得分:3)
我们希望设计的表达式非常有趣。我们可以先在捕获组中稍加修改后添加您的原始表达式,然后再考虑其周围的左右边界。例如,在右边我们可能要使用\D
:
([A-Za-z]{3}[0-9]{1,2})\D
我们当然可以定义一个确切的受限表达式。但是,这可能会起作用。
根据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}`);
});
}
答案 1 :(得分:2)
至少3个字母:[a-zA-Z]{3,}
1位或2位数字(不多于不少):[0-9]{1,2}
这给我们:
/[a-zA-Z]{3,}[0-9]{1,2}/