我正在尝试编写一个正则表达式,以便在至少包含100个字符的文本中查找匹配项。匹配应该是这样的-字符串中的任何子字符串开始时至少包含3个字母,后面至少有1个数字,3个字母后面最多有2个数字。
示例:
我该如何为此编写一个正则表达式?匹配的起始字母长度始终为3,数字长度可以为1或2(不多也不少)
如果3个字母的字符串后面有2个数字,这就是工作。
[A-Za-z]{3}[0-9]{2}
但是数字的长度可以在1到2之间变化。如何在正则表达式中包含变化的长度?
发布于 2019-05-24 07:41:32
我们希望设计的表达式非常有趣。我们可以先在捕获组中添加您的原始表达式,稍作修改,然后我们应该考虑它周围的左右边界。例如,在右侧,我们可能希望使用\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}`);
});
}
发布于 2019-05-24 07:22:07
至少3个字母:[a-zA-Z]{3,}
1位或2位(不多不少):[0-9]{1,2}
这为我们提供了:
/[a-zA-Z]{3,}[0-9]{1,2}/
https://stackoverflow.com/questions/56283981
复制相似问题