使用负前瞻(?!...)
,您可以检查以下模式是否在当前位置不匹配:
(?<![\w@])@(?!\d\d\d\d\b)([\w@]+(?:[.!][\w@]+)*)
这里所讨论的负前瞻是(?!\d\d\d\d\b)
. 该模式将匹配四个数字,然后是一个单词边界。由负前瞻反转,这将匹配任何不是四位数字,然后是单词结尾的内容。
这假定有效的用户名不包含任何会导致单词边界匹配的字符。如果@1234-hello
是一个有效的用户名,这将失败,您需要在 PHP 中执行匹配。
一些示例测试用例如下:
<?php
function test($test) {
$pattern = '/(?<![\w@])@(?!\d\d\d\d\b)([\w@]+(?:[.!][\w@]+)*)/';
echo (preg_match($pattern, $test) ? 'Matches' : 'No match') . "\n";
}
test('Hello @test world'); // Matches
test('Hello @123 world'); // Matches
test('Hello @1234 world'); // No match
test('Hello @12345 world'); // Matches
test('Hello @test1234 world'); // Matches
test('Hello @1234test world'); // Matches
test('Hello @1234-test world'); // No match
test('Hello @1234_test world'); // Matches