字符串中的正则表达式匹配部分

Regex match section within string

我有一个字符串 foo-foo-AB1234-foo-AB12345678。字符串可以是任何格式,有没有办法只匹配以下模式 letter,letter,digits 3-5 ?

我有以下实现:

preg_match_all('/[A-Za-z]{2}[0-9]{3,6}/', $string, $matches);

不幸的是,这会在 AB1234 AND AB12345678 上找到超过 6 位的匹配项。在这种情况下,我只想在 AB1234 上找到匹配项。

我试过了:

preg_match_all('/^[A-Za-z]{2}[0-9]{3,6}$/', $string, $matches);

您会注意到 ^$ 标记了开始和结束,但这仅适用于字符串,而不适用于部分,因此找不到匹配项。

我明白为什么代码会这样。这是合乎逻辑的。不过我想不出解决办法。

您必须以非数字模式结束正则表达式。在 Java 中,这将是 \D,在 PHP 中应该是相同的。

您一定是在寻找单词边界 \b:

\b\p{L}{2}\p{N}{3,5}\b

demo

请注意,\p{L} 匹配一个 Unicode 字母,\p{N} 匹配一个 Unicode 数字。

您也可以使用修改后的正则表达式 \b[a-zA-Z]{2}[0-9]{3,5}\b。请注意,使用锚点会使您的正则表达式仅在字符串的开头(使用 ^)匹配 or/and 在字符串的末尾(使用 $)。

如果您有带下划线的单词(如 foo-foo_AB1234_foo_AB12345678_string),您将需要 slight modification:

(?<=\b|_)\p{L}{2}\p{N}{3,5}(?=\b|_)