用于匹配 3 个字母和 1-2 个数字的正则表达式
RegEx for matching 3 alphabets and 1-2 digits
我正在尝试编写正则表达式以在至少包含 100 个字符的文本中查找匹配项。匹配应该是这样的 - 字符串中的任何子字符串至少包含 3 个字母开头,后面至少有 1 个数字,3 个字母后面最多有 2 个数字。
示例 -
abcjkhklfdpdn24hjkk - 在这种情况下我想提取 pdn24
hjdksfkpdf1lkjk - 在这种情况下我想提取 pdf1
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}`);
});
}
我正在尝试编写正则表达式以在至少包含 100 个字符的文本中查找匹配项。匹配应该是这样的 - 字符串中的任何子字符串至少包含 3 个字母开头,后面至少有 1 个数字,3 个字母后面最多有 2 个数字。
示例 -
abcjkhklfdpdn24hjkk - 在这种情况下我想提取 pdn24
hjdksfkpdf1lkjk - 在这种情况下我想提取 pdf1
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}`);
});
}