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

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

我正在尝试编写一个正则表达式来在至少包含 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 之间变化。如何在正则表达式中包含变化的长度?

最佳答案

我们要设计的表情很有意思。我们可以先在捕获组中添加稍作修改的原始表达式,然后我们应该考虑它周围的左右边界。例如,在右边我们可能想使用 \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}`);
    });
}

关于用于匹配 3 个字母和 1-2 个数字的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56283981/

相关文章:

regex-lookarounds - "Nothing"环视术语 [RAKU]

java - 字符串获取行尾的文本

c# - 不在正则表达式捕获组中包含某些内容的方法

ruby-on-rails - rails : Creating new Ruby on Rails app in existing directory

ruby-on-rails - Ruby 无法发送 SSL 请求,但 Curl 可以

javascript - 正则表达式仅匹配来自任何电子邮件地址的最终域名

python - 问题 : throwing exception in re. 匹配函数

mysql - 在mysql选择查询中需要正则表达式

ruby - 如何检查 Ruby 中的数组中是否存在一个值

javascript - 匹配包含Javascript中特定字符串的字符串中的字符串