返回介绍

7.2 正则表达示中的原子

发布于 2025-01-30 22:11:33 字数 5152 浏览 0 评论 0 收藏 0

原子

原子是正则表达示里面的最小单位,原子说白了就是需要匹配的内容。一个成立的正则表达示当中必须最少要有一个原子。

所有可见不可见的字符就是原子

说明:我们见到的空格、回车、换行、0-9、A-Za-z、中文、标点符号、特殊符号全为原子。

在做原子的实例前我们先来讲解一个函数,preg_match:

int preg_match ( string $正则 , string $字符串 [, array &$结果] )

功能:根据$正则变量,匹配$字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回 0。

注:上面是 preg_match 常用的主要几个参数。我在上面将另外几个参数没有列出来。因为,另外两个参数太不常用了。

我们来通过实验来证明:

<?php
//定义一个变量叫 zz,放正则表达示。为了方便大家记忆,如果你英文比较 ok,建议把变量名还是写成英文的$pattern。

<?php
$zz = '/a/';

$string = 'ddfdjjvi2jfvkwkfi24';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

因为我希望的是匹配 a,而$string 当是是不存在 a 的,所以不成功。

<?php
$zz = '/wq/';

$string = 'ssssswqaaaaaa';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

上面的字符串中 s 后存在 wq,因此匹配成功。

接下来我们匹配一个空格试试:

<?php
$zz = '/ /';

$string = 'sssssw aaaaa';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

执行结果如下:
document/2015-09-04/55e9176710a36

因上,$string 这个变量的 w 字符后存在一个空格。所以匹配成功,输出了字符串类型,长度为 1。只不过我们的肉眼不可见,看不到这个字符串而已。

特殊标识的原子

原子说明
\d匹配一个 0-9
\D除了 0-9 以外的所有字符
\wa-zA-Z0-9_
\W除了 0-9A-Za-z_以外的所有字符
\s匹配所有空白字符\n \t \r 空格
\S匹配所有非空白字符
[ ]指定范围的原子

这个个需要记住,最好达到默写级别。记忆的时候成对记忆,\d 是匹配一个 0-9,那么\D 就是除了 0-9 以外的所有字符。
上面已经说明的很清楚了,我们进行实验一步一步对这些进行学习。

请你在学习的时候,对于这些原子务必达到默写级别。因为,我们以后做实验的时候,一点一点你就学会了。

\d 匹配一个 0-9

<?php
$zz = '/\d/';

$string = '我爱喝 9 你爱不爱喝';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

\D 匹配一个非 0-9 的值

<?php
$zz = '/\D/';

$string = '121243 中 23453453';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

匹配成功,匹配到了中。因为它不是 0-9 之间的字符。

\w 匹配一个 a-zA-Z0-9_

<?php
$zz = '/\w/';

$string = '新中_国万岁呀万岁';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

匹配成功,匹配到了下划线。

\W 匹配一个非 a-zA-Z0-9_

<?php
$zz = '/\w/';

$string = 'afasABCWEQR44231284737';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

匹配失败。因为,上面上面全是 a-zA-Z0-9,没有非 a-zA-Z0-9

\s 匹配所有空白字符\n \t \r 空格

<?php
$zz = '/\s/';

$string = "中国万
岁";

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

匹配成功,因为有一个回车。

\S 非空字符

<?php
$zz = '/\s/';

$string = " 
     a   ";

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

匹配成功。虽然上面有空格,回车和缩进。但是,有一个非空白字符 a。因此,匹配成功。

[] 指定范围的原子

<?php

$zz = '/[0-5]\w+/';

$string = '6a';

$string1 = '1C';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

结论:
上例中 0-5 匹配$string 失败,而$string1 成功。因为,$string 中的第一个数值为 6,不在[0-5]的范围之内。

<?php

$zz = '/[a-zA-Z0-9_]\w/';

$string = 'ab';

$string1 = '9A';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

结论:

$string 和$string1 都匹配成功。因为\w 就是[a-zA-Z0-9_]

<?php

$zz = '/[abc]\d+/';

$string = 'a9';

$string1 = 'b1';

$string2 = 'c5';

$string3 = 'd4';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

结论:

$string、$string1、$string2 匹配成功,而$string3 不成功。因为$string3 超过了[abc]的范围,它是从 d 开始的。

[^ 字符] 不匹配指定区间的字符

<?php

$zz = '/[^0-9A-Za-z_]/';

$string = 'aaaaab311dd';

$string1 = '!$@!#%$#^##';

if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}

?>

结论:

  1. 匹配$string 不成功,但是匹配$string1 的时候成功。因为中括号里面有个抑扬符。
  2. ^ 抑扬符在中括号里面的作用是不准以中括号里面的字符进行匹配。

总结:

原子等价式
\w[a-zA-Z0-9_]
\W[^a-zA-Z0-9_]
\d[0-9]
\D[^0-9]
\s[ \t\n\f\r]
\S[^ \t\n\f\r]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文