3

我正在尝试检查一个字符串是否有一定数量的字符出现。

例子:

$string = '123~456~789~000';

我想验证这个字符串是否正好有 3 个 character 实例~

可以使用正则表达式吗?

4

4 回答 4

5

是的

/^[^~]*~[^~]*~[^~]*~[^~]*$/

解释:

  • ^...$表示许多正则表达式方言中的整个字符串
  • [^~]*零个或多个非波浪字符的字符串
  • ~一个波浪字符

字符串可以有尽可能多的非波浪字符,出现在字符串中的任何位置,但必须恰好有三个波浪号,不多也不少。

于 2012-10-14T14:23:23.663 回答
5

由于单个字符在技术上是一个子字符串,并且任务是计算它的出现次数,我想最有效的方法在于使用一个特殊的 PHP 函数 - substr_count

$string = '123~456~789~000';
if (substr_count($string, '~') === 3) {
  // string is valid
}

显然,如果您需要计算模式匹配的数量,这种方法将不起作用(例如,虽然您可以使用 来计算字符串中 '0' 的数量substr_count,但最好使用preg_match_allcount 来计算

然而,对于这个特定的问题,它应该更快,因为substr_count它针对一个特定的目标进行了优化 - 计算子串 - 当preg_match_all更普遍的时候。)

于 2012-10-14T15:21:12.403 回答
4

我相信这应该适用于可变数量的字符:

^(?:[^~]*~[^~]*){3}$

这里的优点是您只需将 3 替换为您想要检查的任何数量。

为了提高效率,可以写成

^[^~]*(?:~[^~]*){3}$
于 2012-10-14T14:28:39.127 回答
0

这就是您要查找的内容:

根据以下评论进行编辑

<?php

$string = '123~456~789~000';
$total  = preg_match_all('/~/', $string);
echo $total; // Shows 3
于 2012-10-14T14:58:47.907 回答