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

4

我有一个字符串foo-foo-AB1234-foo-AB12345678。该字符串可以以任何格式出现,是否有一种方法仅匹配以下模式字母、字母、3-5位数字?

我有以下实现:

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

很遗憾,这会在 AB1234AB12345678 上找到匹配项,而后者有超过6个数字。在这种情况下,我只希望找到 AB1234 的匹配项。

我尝试了:

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

你会注意到^$用来标记开头和结尾,但这仅适用于字符串而非段落,因此找不到匹配项。
我理解代码的行为方式,它是有逻辑意义的。但我无法想出解决方案。

你可以使用这个[a-zA-Z]+[0-9]*。 - Raghavendra
2个回答

1
你可能正在寻找单词边界 \b
\b\p{L}{2}\p{N}{3,5}\b

请查看演示

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

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

如果您有下划线单词(例如foo-foo_AB1234_foo_AB12345678_string),您需要进行轻微修改

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

1
非常感谢。我确实尝试了“单词边界”实现,但没有到这个程度。完美地工作。 - user1320260

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接