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

时间:2015-08-03 08:57:42

标签: php regex preg-match-all

我有一个字符串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);

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

我理解为什么代码表现得像。它具有逻辑意义。但我无法弄清楚解决方案。

2 个答案:

答案 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中应该是相同的。