正则表达式以匹配特定字符的确切出现次数

时间:2012-10-14 14:21:23

标签: php regex

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

示例:

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

我想验证此字符串是否恰好有3个字符~的实例。

使用正则表达式可以吗?

4 个答案:

答案 0 :(得分:5)

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

说明:

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

字符串可以根据需要包含任意数量的非波形字符,出现在字符串中的任何位置,但必须具有正好三个波浪,不多也不少。

答案 1 :(得分:4)

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

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

显然,如果您需要计算模式匹配的数量(例如,虽然您可以使用substr_count计算字符串中'0'的数量,这种方法将无法使用,您最好使用{{ 1}}计算位数)。

然而对于这个具体问题,它应该更快整体,因为preg_match_all针对一个特定目标进行了优化 - 计算子字符串 - 当substr_count更多地在通用方面时。 )

答案 2 :(得分:2)

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

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

这里的优点是你只需要用你想要检查的许多人来替换3。

为了提高效率,可以将其写成

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

答案 3 :(得分:0)

这就是你要找的东西:

编辑基于以下comment

<?php

$string = '123~456~789~000';
$total  = preg_match_all('/~/', $string);
echo $total; // Shows 3