我正在参加在线培训正则表达式类(class)。
问题是
With regex you can count the number of matches. Can you make it return the number of uppercase consonants (B,C,D,F,..,X,Y,Z) in a given string? E.g.: it should return 3 with the text ABcDeFO!. Note: Only ASCII. We consider Y to be a consonant! Example: the regex /./g will return 3 when run against the string abc.`
我的解决方案是
/[BCDFGHJKLMNPQRSTVWXYZ]/g
( 26 个字符长)我的另一个解决方案是
/(?![AEIOU])[A-Z]/g
这是 19 长字符。但是根据网上的统计,最短的解是 16 长字符。任何想法如何做到这一点?最佳答案
我想我已经设法将正则表达式的长度降低到 16,你说这是所需的最小长度。
利用问题所说的事实,
Note: Only ASCII
无论您如何努力减少正则表达式的长度,正或负前瞻正则表达式都超出了长度。包括所有允许的大写辅音会导致 26 的长度太多了。
因此,唯一的方法似乎是使用否定字符类,其中一些我们如何巧妙地排除所有不需要的字符。这是正则表达式,它拒绝除大写辅音之外的所有 ASCII 字符。
[^ -AEIOU[-ÿ]
^
将其标记为 A " -A"
的否定字符类和空格排除在 ASCII 表中看到的所有不需要的字符,因为它们不是必需的。然后我们取出E
I
O
U
具体然后,可以使用 [-ÿ
排除剩余的不需要的 ASCII 字符。范围,如 [
字符紧跟在 Z
之后和 ÿ
作为扩展 ASCII 字符中的最后一个字符。因此创建了上面的正则表达式,它只匹配大写辅音字符,不包括其余的所有 ASCII 字符。此正则表达式的总长度
/[^ -AEIOU[-ÿ]/g
如您所料,是 16。让我知道这是否适合您。Demo
PHP代码,
$s = 'GAsSDITR';
preg_match_all(@'/[^ -AEIOU[-ÿ]/', $s, $matches);
echo count($matches[0]);
打印,
5
Online PHP Demo
关于php - 正则表达式只过滤大写辅音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54799576/