我有一个字符串foo-foo-AB1234-foo-AB12345678
。字符串可以是任何格式,有没有办法只匹配以下模式字母,字母,数字3-5 ?
我有以下实现:
preg_match_all('/[A-Za-z]{2}[0-9]{3,6}/', $string, $matches);
不幸的是,这会在AB1234
和AB12345678
上找到一个超过6位的匹配项。我只希望在这个例子中找到AB1234
的匹配。
我试过了:
preg_match_all('/^[A-Za-z]{2}[0-9]{3,6}$/', $string, $matches);
您会注意到^
和$
标记开头和结尾,但这仅适用于字符串,而不是部分,因此找不到匹配项。
我理解为什么代码表现得像。它具有逻辑意义。但我无法弄清楚解决方案。
答案 0 :(得分:1)
您必须寻找字边界\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
。请注意,使用锚点只能在字符串的开头(使用^
)或/和字符串的末尾(使用$
)匹配正则表达式。
如果您有强调的字词(例如foo-foo_AB1234_foo_AB12345678_string
),则需要slight modification:
(?<=\b|_)\p{L}{2}\p{N}{3,5}(?=\b|_)
答案 1 :(得分:0)
您必须使用非数字的模式结束正则表达式。在Java中,这将是\D
,这在PHP中应该是相同的。