1.1 普通字符组

xiaoxiao2021-02-28  110

字符组是正则表达式最基本的结构之一,字符组就是一组字符,在正则表达式中,它表示“在同一个位置可能出现的各种字符”。其写法是在一对方括号[.....]之间列出所有可能出现的字符。      字符可以分为很多类,比如数字、字母、符号等。

简单的字符组如:

[0123456789]、[987654321]、[012345abc6789]

字符范围表示法:

所谓范围表示法,就是用[x-y]的形式表示x到y整个范围内的字符,省去一一列出的麻烦,[0123456789]就可以用[0-9]表示。

范围表示法的范围是如何确定的:

在字符组中“-”表示的范围一般是根据字符对应的码值来确定的,码值小的字符在前,码值大的字符在后。在ASCLL编码中(十进制),字符0的码值是48,字符9的码值是57,所以[0-9]等价于[0123456789];而[9-0]则是错误的范围,因为9的码值大于0的码值,所以会报错。

[0-9]范围表示法的例子:

<?php $str = '05816516551'; preg_match_all('/[0-9]/', $str, $res); echo "<pre>"; print_r( $res );

运行结果:

Array ( [0] => Array ( [0] => 0 [1] => 5 [2] => 8 [3] => 1 [4] => 6 [5] => 5 [6] => 1 [7] => 6 [8] => 5 [9] => 5 [10] => 1 ) )

[9-0]错误范围表示法的示例

<?php $str = '05816516551'; preg_match_all('/[9-0]/', $str, $res); echo "<pre>"; print_r( $res ); 运行结果:

Warning: preg_match_all(): Compilation failed: range out of order in character class at offset 3 in F:\phpStudy\WWW\1.php on line 4

* [0-9]是合法的,[9-0]会报错:

如果你知道0-9的码值是48-57,a-z的码值是97-122,A-Z的码值是65-90,能不能用[0-z]同意表示数字字符、小写字母、大写字母呢?

答案是可以,但是不推荐这么做。

根据管理,字符组的范围表示法都表示一类字符(数字是一类)(字母是一类)。

[0-9]、[a-z]是很好理解的,但是[a-z]却很难理解,不熟悉ASCLL编码的人甚至不知道这个字符组还能匹配大写字母和不少标点符号。

奇怪的匹配示例:

<?php preg_match_all('/[0-z]/', 'A', $res); echo "<pre>"; print_r( $res );

运行结果: Array ( [0] => Array ( [0] => A ) ) 可以看到[0-z]匹配大写字母A的时候居然也会成功匹配。

ASCLL编码表(片段)

码值字符码值字符码值字符码值字符码值字符48063?78N93]108l49164@79O94^109m50265A80P95_110n51366B81Q96`111o52467C82R97a112p53568D83S98b113q54669E84T99c114r55770F85U100d115s56871G86V101e116t57972H87W102f117u58:73I88X103g118v59;74J89Y104h119w60<75K90Z105i120x61=76L91[106j121y62>77M92\107k122z

转载请注明原文地址: https://www.6miu.com/read-41087.html

最新回复(0)