我正在参加在线培训正则表达式课程。 问题是
使用正则表达式,您可以计算匹配数。您能否让它返回给定字符串中大写辅音的数量(B,C,D,F,..,X,Y,Z)?例如:它应返回3,文字ABcDeFO!。注意:仅ASCII。我们认为Y是辅音!例如:对字符串abc运行时,正则表达式/./g将返回3。
我的解决方法是/[BCDFGHJKLMNPQRSTVWXYZ]/g
( 26 个字符长)
我的另一个解决方法是/(?![AEIOU])[A-Z]/g
,它的长度为 19 个字符。但是根据在线统计数据,最短的解决方案是 16 个字符。有任何想法该怎么做吗?
答案 0 :(得分:1)
我认为我已经设法将正则表达式的长度减小到16,这是您要求的最小长度。
利用问题所在的事实
注意:仅ASCII
无论正尝试减小正则表达式长度如何,正向或负向正视正则表达式都超过了长度。包括所有允许的大写辅音,将导致26个长度过长。
因此,唯一的方法似乎是使用否定的字符类,在这里我们巧妙地排除了所有不需要的字符。这是正则表达式,它拒绝除大写辅音之外的所有ASCII字符。
[^ -AEIOU[-ÿ]
^
将其标记为否定的字符类,并且A " -A"
的空格排除了所有不需要的字符,如ASCII表中所示,因为它们是不需要的。然后,我们专门取出E
I
O
U
,然后使用[-ÿ
范围来排除剩余的不需要的ASCII字符,如[
在扩展的ASCII字符中,Z
和ÿ
是最后一个字符之后立即出现字符。因此,上面创建的regex仅匹配大写辅音字符,其余所有ASCII字符除外。
此正则表达式/[^ -AEIOU[-ÿ]/g
的总长度为16,如您所料。让我知道这是否适合您。
PHP代码,
$s = 'GAsSDITR';
preg_match_all(@'/[^ -AEIOU[-ÿ]/', $s, $matches);
echo count($matches[0]);
打印
5
答案 1 :(得分:1)
这将匹配所有非AEIOUa-z
的内容,然后添加\W\d
意味着它也将排除所有特殊字符和数字。
这是17个字符,据我所知,它适用于所有字符串。
preg_match_all("/[^AEIOUa-z\W\d]/", $str, $m);
var_dump($m);
返回
array(1) {
[0]=>
array(3) {
[0]=>
string(1) "B"
[1]=>
string(1) "D"
[2]=>
string(1) "F"
}
}