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