Php 只过滤大写辅音的正则表达式

Php 只过滤大写辅音的正则表达式,php,regex,Php,Regex,我正在参加一个在线的regex培训课程。 问题是 使用正则表达式,您可以计算匹配数。你能让它返回给定字符串中大写辅音(B,C,D,F,…,X,Y,Z)的数量吗?例如:返回3,文本为ABcDeFO!。注:仅限ASCII码。我们认为Y是辅音!示例:当对字符串abc运行时,regex//g将返回3` 我的解决方案是/[bcdfghjklmnpnpqrstvwxyz]/g(26字符长) 我的另一个解决方案是/(?![AEIOU])[A-Z]/g,长度为19个字符。但根据在线统计,最短的解决方案是16个字

我正在参加一个在线的regex培训课程。 问题是

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

我的解决方案是
/[bcdfghjklmnpnpqrstvwxyz]/g
26字符长)

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



我想我已经成功地将正则表达式长度降低到了16,你说这是所需的最小长度

利用问题所说的事实

注:仅限ASCII码

无论您如何努力减少正则表达式长度,正向或负向前瞻正则表达式都超出了长度。包括所有允许的大写辅音会导致26个长度太长

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

[^ -AEIOU[-ÿ]
^
将其标记为一个否定字符类,空格为a
“-a”
排除ASCII表中所有不需要的字符,因为它们不需要。然后我们特别取出
E
I
O
U
,然后可以使用
[-ÿ
范围排除剩余的不需要的ASCII字符,如
[
字符紧跟在
Z
之后,并且
ÿ
是扩展ASCII字符中的最后一个字符。因此,创建了上面的正则表达式,它只匹配大写辅音字符,不匹配所有ASCII字符

这个regex
/[^-AEIOU[-ÿ]/g
的总长度是您预期的16。请告诉我这是否适合您

PHP代码

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

5

这将匹配任何不是
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"
  }
}

允许预替换?请尝试
.½§1234567890!”。%~*'2-,;:>这是一个与您的示例中完全不同的字符串。但只需在模式中添加
。这是18个字符。是的,我只是想知道人们如何仅以16个字符通过测试。您可以自己尝试。我对82个字符的正则表达式更感兴趣。我不知道为什么这个答案被高估。我的解决方案甚至很短呃……这根本不能回答我的问题。@kpda806G:我还可以将正则表达式的长度再减少一个字符。您可以将它写成
(?![AEIOU])[A-Z]而不是
(?![EIOU])[B-Z]
。让我看看是否可以将其长度再减少两个字符。@kpda806G:我已经更新了我的答案,其中正则表达式的长度现在如您所期望的那样为16。希望这对您来说可以正常工作。正则表达式中的“^”后面是否有一个空格?即“-a”范围部分?如果是,则它包含从\0到31的字符。这将在正则表达式101上失败如果您还没有测试过,则测试任务。