我正在尝试检查一个字符串是否有一定数量的字符出现。
例子:
$string = '123~456~789~000';
我想验证这个字符串是否正好有 3 个 character 实例~
。
可以使用正则表达式吗?
是的
/^[^~]*~[^~]*~[^~]*~[^~]*$/
解释:
^
...$
表示许多正则表达式方言中的整个字符串[^~]*
零个或多个非波浪字符的字符串~
一个波浪字符字符串可以有尽可能多的非波浪字符,出现在字符串中的任何位置,但必须恰好有三个波浪号,不多也不少。
由于单个字符在技术上是一个子字符串,并且任务是计算它的出现次数,我想最有效的方法在于使用一个特殊的 PHP 函数 - substr_count:
$string = '123~456~789~000';
if (substr_count($string, '~') === 3) {
// string is valid
}
显然,如果您需要计算模式匹配的数量,这种方法将不起作用(例如,虽然您可以使用 来计算字符串中 '0' 的数量substr_count
,但最好使用preg_match_all
count 来计算)。
然而,对于这个特定的问题,它应该更快,因为substr_count
它针对一个特定的目标进行了优化 - 计算子串 - 当preg_match_all
更普遍的时候。)
我相信这应该适用于可变数量的字符:
^(?:[^~]*~[^~]*){3}$
这里的优点是您只需将 3 替换为您想要检查的任何数量。
为了提高效率,可以写成
^[^~]*(?:~[^~]*){3}$
这就是您要查找的内容:
根据以下评论进行编辑:
<?php
$string = '123~456~789~000';
$total = preg_match_all('/~/', $string);
echo $total; // Shows 3