简体   繁体   中英

Regular expression to match an exact number of occurrence for a certain character

I'm trying to check if a string has a certain number of occurrence of a character.

Example:

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

I want to verify if this string has exactly 3 instances of the character ~ .

Is that possible using regular expressions?

Yes

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

Explanation:

  • ^ ... $ means the whole string in many regex dialects
  • [^~]* a string of zero or more non-tilde characters
  • ~ a tilde character

The string can have as many non-tilde characters as necessary, appearing anywhere in the string, but must have exactly three tildes, no more and no less.

As single character is technically a substring, and the task is to count the number of its occurences, I suppose the most efficient approach lies in using a special PHP function - substr_count :

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

Obviously, this approach won't work if you need to count the number of pattern matches (for example, while you can count the number of '0' in your string with substr_count , you better use preg_match_all to count digits ).

Yet for this specific question it should be faster overall, as substr_count is optimized for one specific goal - count substrings - when preg_match_all is more on the universal side. )

I believe this should work for a variable number of characters:

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

The advantage here is that you just replace 3 with however many you want to check.

To make it more efficient, it can be written as

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

This is what you are looking for:

EDIT based on comment below:

<?php

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM