正则表达式学习

Posted stem

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式学习相关的知识,希望对你有一定的参考价值。

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

正则表达式的特点是:

1. 灵活性、逻辑性和功能性非

常强;

2. 可以迅速地用极简单的方式达到字符串的复杂控制。

3. 对于刚接触的人来说,比较晦涩难懂。

正则表达式用途:

判断字符串是否符合某一规则(判断是否符合手机号、邮箱规则)。

从一个字符串中找出符合规则的所有子字符串(取HTML标签名)。

 

  自定义字符结合

  • 字符集合:[单个字符或字符区间],用于匹配集合内字符

   如:

  • [a-z]表示a-z这26个小写字母
  • [0-9a-z]表示0-9这10个数字和a-z26个小写字母
  • [135a-h]表示包含数字1,3,5和字母a-h这8个字母
  • 注意:两个不同字符段间请勿使用,隔开。
  • 非集:[^单个字符或字符区间],用于匹配非集合内字符。

   如:

  • [^0-9]表示匹配所有非数字字符。
  • [^a-zA-Z]表示匹配所以非字母字符。

这里要介绍下我们正则表达式的语法规则

1,行定位符

^表示行的开始,$表示行的结尾

exp:

^am 这个表达式就是要匹配字符串am的开始位置是行头(简言之就是am必须在字符串的头的位置)

amazing就可以匹配到am,而sham就匹配不到

$am 这个表达式就是要匹配字符串am的开始位置是结尾处(简言之就是am必须在字符串的尾部的位置)

则$am 就是可以匹配到sham的am字符串

2,单词分界符

 表示要匹配表达式中的整个字符串的单词

如ma则只是匹配ma这个单词如ma 不匹配mass等单词

B则是跟相反 匹配的字符串不能是完整的单词

如BamB 就只能匹配amazing ham 的这类中间存在字符串am的单词

3,字符类

自定义字符结合

  • 字符集合:[单个字符或字符区间],用于匹配集合内字符
  • []这个就是字符类匹配的符号

4,选择字符  |

这个“|” 可以简单的理解为或的意思

| 可以匹配任意撒长度的字符串

[] 只能匹配单个字符串如字符区间[abcdefghijklmnopqrstuvwxyz] 就是匹配a-z中的任意一个字符

5,连写符 -

上个样例就是写了很多很费时间那我们可以这样表示[a-z]是不是简单很多

6,排除字符 [^]此处为了不跟^混淆所以[^]表示非集合中的字符

[^a-zA-Z]就是表示匹配不是数字和字母的字符

7,限定符 ?   *   + {n,m}

限定符                             说明                                      举例

?                  匹配前面的字符零次或一次     stem?则可以匹配stem steer  

+                 匹配前面的字符一次或多次     go+ogle则可以匹配到google 和gooooooogle

*                  匹配前面的字符零次或多次    go*ogle则可以匹配到goooooogle gogle

{n}              匹配前面的字符n次                 go{2}gle则只能匹配到google

{n,}             匹配前面的字符最少n次         go{2,}gle则可以匹配到google和goooooooooogle

{n,m}          匹配前面的字符最少n次做多m次  amaz{0,2}ing 就能匹配到amaing amazing amazzing 

8,点号字符(.)

. 可以匹配到除换行符外的任意一个字符 如^s.d$就只能匹配到sad这类s开头d结尾的三个字的单词

 ^s.d.*f$   ^s.d.*f$先去除^$    s.d.* .表示匹配除换行符的任意一个字符  *表示匹配前面的字符零次或多次那么则可以匹配到如sadaaaaaaaaf 或 s1df类的字符

9,转义字符()

如果我们要想要匹配ip地址类那我们使用.来当做ip地址中的话会有如下表达式

[0-9]{1,3}(.[0-9]{1,3}){3} 

[0-9]{1,3}表达式表示匹配0-9的数字最少1次最多3次如1 11 111 192 100

(.[0-9]{1,3}){3} 表达式表示匹配3次.{0-9]{1,3}

.{0-9]{1,3}.{0-9]{1,3}.{0-9]{1,3} 这个就可以匹配 .1.1.1 也可以表示010101等等

因为这里.表示匹配除换行符的任意字符所以这个可以使用转义字符. 来真正的匹配.

那么我们上面的匹配ip地址的表达式可以这样写

[0-9]{1,3}(.[0-9]{1,3}){3} 这样就能精准的匹配我们的ip地址了 

10,反斜线()

反斜线不仅仅可以做转义字符外,还可以显示一些不可打印的字符出来

反斜线可以显示的不可打印的字符

a警报 退格 eEscape f换页符 换行符 回车符 水平制表符

常用转义字符:

  • 数字:d
  • 非数字:D
  • 空白字符(空格、制表符、换页符等):s
  • 非空白字符:S
  • 制表符:
  • 回车符:
  • 换行符:
  • 单词字符(26个英文字母+数字+下划线_):w
  • 非单词字符:W

11,括号字符()

小括号的作用不仅可以改变限定符的作用范围如(thir|four)th可以匹配thirth 或者 fourth

还可以分组即子表达式如(.[0-9]{1,3}){3}就是对(.[0-9]{1,3})进行了分组

 

12,模式修饰符

i 忽略大小写模式

M 多文本模式

s 单文本模式

X 忽略空白字符

最后我们学习下我们正则表达式的几个函数

一,preg_grep()

array preg_grep(string pattern,array input)

使用数组input中的元素来匹配pattern的表达式并返回所有匹配的元素组成的数组

<?php
    $preg = ‘/d{3,4}-?d{7,8}/‘;
    $arr = array(‘043212345678‘,‘0431-7654321‘,‘12345678‘);
    $preg_arr = preg_grep($preg,$arr);
    var_dump($preg_arr);
?>

这样运行下来就能匹配到如下结果

array(2) { [0]=> string(12) "043212345678" [1]=> string(12) "0431-7654321" }

 

二,preg_match()和preg_match_all()函数

preg_match()函数就是进行正则匹配返回匹配的次数但是在匹配成功后就不再匹配了

preg_match_all()函数是一直匹配到最后才会停止

我们看看下面的样例

<?php
    $str = ‘This is an example!‘;
    $preg = ‘/w{2}/‘;
    $num1 = preg_match($preg,$str,$str1);
    echo $num1.‘<br>‘;
    var_dump($str1);
    $num2 = preg_match_all($preg,$str,$str2);
    echo ‘<br>‘.$num2.‘<br>‘;
    var_dump($str2);
?>
1
array(1) { [0]=> string(2) "is" } 
2
array(1) { [0]=> array(2) { [0]=> string(2) "is" [1]=> string(2) "an" } }

这里可以看出我们的两个函数的区别了

preg_match_all匹配了两次 ,而preg_match就只是匹配到就返回了1

三,preg_quote()函数

该函数是将表达式中的特殊字符全部进行自动转义。

四,preg_replace()函数

该函数是将字符串中匹配到表达式的全部替换成指定的字符

五,preg_replace_callback()函数

几乎和preg_replace()函数差不多都是用于查找和替换字符,但是preg_replace_callback()函数还有使用一个回调函数callback来代替参数

六,preg_split()函数

就是简单的分隔字符串的函数

 

 这里我们做一道CTF的题

<?php  
$key=‘flag{********************************}‘; 
$Regular= preg_match("/stem.*key.{2,9}:/.*/(key*key)/i", trim($_GET["id"]), $match); 
if( $Regular ){  
  die(‘key: ‘.$key); 
} 
?>

这个php就是使用正则匹配id接收到的值如果匹配成功就返回flag

那我们先吧表达式拿出来看看

/stem.*key.{2,9}:/.*/(key*key)/i

/是正则表达式的分隔符 i表示不区分大小写

我们直接去掉分隔符和i    stem.*key.{2,9}:/.*/(key*key)

.匹配除换行符的字符

*匹配前面的字符零次或多次

.*组合起来就是匹配任意除换行符的字符零次或多次

{2,9}表示匹配前面的字符最少2次最多9次

是我们的转义符来输出/

子表达式(key*key)ke(零个或多个y)key

那我们的整个可以这样一一写出来

/stem.*key.{2,9}:/.*/(key*key)/i

stem(匹配任意除换行符的字符零次或多次)key11(.{2,9}匹配任意除换行符的字符2次或9次):/sssssssss(.*组合起来就是匹配任意除换行符的字符零次或多次)/keyyyyyyyyyyyyyyyyyyyyyyyyyyy(y*匹配零个或多个y)key

 

那我们的也可以这样写

stemmmmmmmmmkeyooooooooo:/ooooooooooooooo/kekey

技术图片

 

以上是关于正则表达式学习的主要内容,如果未能解决你的问题,请参考以下文章

python基础学习(十三)

python基础学习笔记(十三)

text 正则表达式片段

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配