字符串中的正则表达式匹配部分
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|_)
我有一个字符串 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|_)