正则表达式仅过滤大写辅音

时间:2019-02-21 05:02:28

标签: php regex

我正在参加在线培训正则表达式课程。 问题是

  

使用正则表达式,您可以计算匹配数。您能否让它返回给定字符串中大写辅音的数量(B,C,D,F,..,X,Y,Z)?例如:它应返回3,文字ABcDeFO!。注意:仅ASCII。我们认为Y是辅音!例如:对字符串abc运行时,正则表达式/./g将返回3。

我的解决方法是/[BCDFGHJKLMNPQRSTVWXYZ]/g 26 个字符长)

我的另一个解决方法是/(?![AEIOU])[A-Z]/g,它的长度为 19 个字符。但是根据在线统计数据,最短的解决方案是 16 个字符。有任何想法该怎么做吗?


screenshot

2 个答案:

答案 0 :(得分:1)

我认为我已经设法将正则表达式的长度减小到16,这是您要求的最小长度。

利用问题所在的事实

  

注意:仅ASCII

无论正尝试减小正则表达式长度如何,正向或负向正视正则表达式都超过了长度。包括所有允许的大写辅音,将导致26个长度过长。

因此,唯一的方法似乎是使用否定的字符类,在这里我们巧妙地排除了所有不需要的字符。这是正则表达式,它拒绝除大写辅音之外的所有ASCII字符。

[^ -AEIOU[-ÿ]

^将其标记为否定的字符类,并且A " -A"的空格排除了所有不需要的字符,如ASCII表中所示,因为它们是不需要的。然后,我们专门取出E I O U,然后使用[-ÿ范围来排除剩余的不需要的ASCII字符,如[在扩展的ASCII字符中,Zÿ是最后一个字符之后立即出现字符。因此,上面创建的regex仅匹配大写辅音字符,其余所有ASCII字符除外。

此正则表达式/[^ -AEIOU[-ÿ]/g的总长度为16,如您所料。让我知道这是否适合您。

Demo

PHP代码,

$s = 'GAsSDITR';
preg_match_all(@'/[^ -AEIOU[-ÿ]/', $s, $matches);
echo count($matches[0]);

打印

5

Online PHP Demo

答案 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"
  }
}

https://3v4l.org/a0ETV