如何在大型数字列表中按特定掩码查找数字?(Regex + PHP)
用PHP正则匹配符合特定掩码的7位数字
针对你提出的掩码规则AA* XY YX,我们可以通过正则表达式精准匹配符合要求的数字,下面一步步拆解规则并给出PHP实现方案:
规则拆解
先明确每个占位符的核心要求:
AA*:前两位数字必须完全相同,第三位可以是0-9任意数字(比如118、559符合,808因为前两位8和0不同就不符合)XY:任意两位数字(比如75、93都可以)YX:必须是前一组XY的逆序(比如XY是75,YX就得是57;XY是93,YX就得是39)- 整体是固定格式:7位数字用空格分隔为
3位 2位 2位
正则表达式编写
根据上面的规则,我们可以写出针对性的正则:
/^(\d)\1\d (\d)(\d) \3\2$/
各部分详细解释:
^和$:锚定字符串的开头和结尾,确保整个数字串完全匹配规则,避免出现部分匹配的无效结果(\d)\1\d:对应AA*部分,(\d)捕获第一个数字,\1匹配和这个数字相同的字符(实现AA的重复要求),最后\d匹配任意数字(实现*的任意性)(\d)(\d):捕获第二部分的两个数字,分别作为分组2和分组3(对应X和Y)\3\2:对应YX部分,调用分组3和分组2的内容,实现逆序匹配的要求
PHP代码实现
方式1:批量过滤数字列表
如果你的数字是一个数组,可以用preg_grep直接过滤出符合条件的项:
$numberList = [ '118 75 57', '559 93 39', '777 25 56', '808 44 55', ]; $pattern = '/^(\d)\1\d (\d)(\d) \3\2$/'; $validNumbers = preg_grep($pattern, $numberList); print_r($validNumbers);
运行后输出:
Array ( [0] => 118 75 57 [1] => 559 93 39 )
方式2:逐个检查数字合法性
如果需要逐个判断每个数字是否符合规则,可以用preg_match:
$numberList = [ '118 75 57', '559 93 39', '777 25 56', '808 44 55', ]; $pattern = '/^(\d)\1\d (\d)(\d) \3\2$/'; foreach ($numberList as $num) { if (preg_match($pattern, $num)) { echo "$num - 符合\n"; } else { echo "$num - 不符合\n"; } }
运行后输出:
118 75 57 - 符合 559 93 39 - 符合 777 25 56 - 不符合 808 44 55 - 不符合
内容的提问来源于stack exchange,提问作者Nail
相关产品推荐
相关产品推荐

