正则校验-我需要的正则表达式知识

2023-11-02

正则校验:我需要的正则表达式知识

正则表达式由正则表达式引擎提供支持,不同编程环境有不同的正则表达式引擎,在实际使用正则表达式的过程中会有一些差别;


什么是正则表达式

正则表达式是用于描述匹配复杂字符串规则的工具,一个正则表达式对应着一个文本规则;


EP1:查找一段文本中的字符串hq,这是一个姓名的缩写,需要是单独的一个单词

  • 精确匹配字符串hq,处理正则时一般支持忽略大小写的选项,如果选中,那么就可以匹配到hq,HQ,Hq,hQ四种;
  • 如果直接查找字符串HQ,那么可能匹配到其他包含该字符串的单词,而我们要的是精确匹配;
//精确匹配单词hq
"\bhq\b"

\b 是正则支持的特殊代码,也叫元字符(metacharacter),表示单词的分界处,即单词的开头和结尾位置;


EP1-1:hq后面不远处跟着一个dm,应该使用如下正则表达式

//hq 任意个任意字符(但不能有换行) 最后还是dm这个单词
"\bhq\b.*\bdm\b"

. 也是一个元字符,可以匹配除了换行符以外的任意字符;

* 同样是元字符,它不代表字符或位置,而是代表数量,表示*前面的内容可以连续重复使用任意次(可能0次);


EP2:以0开头 然后是两个数字 然后是一个连字符“-”,最后是8个数字

"0\d\d-\d\d\d\d\d\d\d\d"

\d 元字符,匹配一位数字;

-不是元字符 只匹配自己;


EP2-1:为了避免重复,可以修改正则如下

"0\d{2}-\d{8}"

这里{n} 表示前面的\d必须连续重复匹配2次/8次;


元字符

现在我们已经知道了\b.*\d这几个元字符,还有更多,我们结合例子一起看;

\s 元字符,匹配任意的空白符,包括 空格、制表符(Tab)、换行符、中文全角空格等;

\w 元字符,匹配字母或数字或下划线或汉字等;


EP3:匹配以字母a开头的单词

"\ba\w*\b"

EP3-1:匹配刚好6个字符的单词

"\b\w{6}\b"

EP4:匹配一个或多个连续的数字

"\d+"

+ 元字符,和*类似,表示匹配重复1次或更多次;


EP5:填写的QQ号必须为5到12位的数字

"^\d{5,12}$"

^ 元字符,匹配字符串的开始位置;

$ 元字符,匹配字符串的结束位置;

这里使用了^$,则表示校验的整个字符串从开始到结束,都要用\d{5,12}进行匹配;如果不使用,只能保证字符串中包含5到12位的连续数字;

这里的{5,12}表示重复次数不少于5,不大于12;

处理正则时一般支持处理多行的选项,如果选中,^$就表示匹配行的开始和结束位置;【?


JavaScript中的正则表达式

参考JavaScript RegExp 对象;


字符转义

如果要查找元字符本身的话,需要使用\来取消这些符号的特殊意义,如\.\*\\

例如:匹配C:\Windows 使用 C:\\Windows;匹配deerflower.cn使用deerflower\.cn


重复

代码/语法 说明
* 重复0次或多次
+ 重复1次或多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或多次
{n,m} 重复n次到m次

例如:匹配一行/整段字符串的第一个单词 使用^\w+


字符类

对于数字 字母 空白符等已经有了对应这些字符集合的元字符,但如果想匹配自定义的字符集合,可以使用方括号;


EP6:匹配任何一个英文元音字母

"[aeiou]"

EP6-1:匹配三个标点符号中的一个

"[.?!]"

EP7:匹配字符范围 0-9 中的一个

"[0-9]"//与\d完全一致

EP7-1:匹配字符范围 0-9大小写字母 中的一个

"[a-z0-9A-Z]"//只考虑英文的话,与\w完全一致

请尝试分析下这个正则:\(?0\d{2}[) -]?\d{8}

  • () 都是元字符,所以这里用了转义;
  • 首先是一个转义字符\(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)-空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})

上边这个正则会匹配到010)12345678(022-87654321 这样的格式(我们所希望的是匹配(010)88886666,或022-22334455,或029 12345678这样的格式),解决这个问题需要用到分支条件;


分支条件

分支条件指有几种规则,满足其中任意一个就算匹配成功,具体使用|把不同的规则分隔开;


分析正则 0\d{2}-\d{8}|0\d{2}-\d{7}

  • 可以匹配到 两种以连字符分隔的电话号码,一种三位区号、一种四位区号;

需要注意:使用分支条件时,要注意各个条件的顺序;

分析正则:\d{5}-\d{4}|\d{5},如果其条件顺序倒置会发生什么;

  • 如果倒置为\d{5}|\d{5}-\d{4},就是能匹配到5位数字(以及9位数字的前5位);
  • 匹配条件分支时,会从左到右测试每个条件,如果满足某个分支的话,就不会再去匹配其他条件了;

分组

重复单个字符时,需要在字符后加上限定符;要重复多个字符串,则需要使用小括号里指定子表达式(也叫分组);小括号在这里是元字符,表示分组

分析正则:(\d{1,3}\.){3}\d{1,3},这是一个简单的IP地址匹配表达式;

  • (\d{1,3}\.){3}匹配三位数字加上一个英文句号(整体作为一个分组)重复3次;
  • 最后再加上一个1到3位的数字;

但是他可能会匹配到不正确的IP地址,所以实际匹配IP地址会用到这个下面这个冗长的分组:
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

仔细分析下,现在我们已经能解读出这个正则表达式所匹配的含义了;


反义

如查找除xxx以外的任意字符,需要用到反义;

反义语法 描述
\W 匹配任意不是 字母数字下划线汉字的字符;
\S 匹配任意不是 空白符的字符;
\D 匹配任意非 数字的字符;
\B 匹配不是单词开头或结束的位置;
[^x] 匹配除了x以外的任意字符;
[^aeiou] 匹配除了aeiou以外的任意字符;

反义示例:

  • \S+ 匹配 不包含空白字符的字符串;
  • <a[^>]+> 匹配 用尖括号括起来的以a开头的字符串;

其他进阶内容

  • 向后引用:通过组号/组名可以实现向后引用之前分组已经匹配的内容;
  • 零宽断言:零宽度正预测先行断言(?=exp),零宽度正回顾后发断言(?<=exp)
  • 负向零宽度断言:零宽度负预测先行断言(?!exp),零宽度负回顾后发断言(?<!exp)
  • 注释:(?#comment)
  • 贪婪与懒惰:表5.懒惰限定符;
  • 处理选项:IgnoreCase(忽略大小写) Multiline(多行模式) Singleline(单行模式) IgnorePatternWhitespace(忽略空白) ExplicitCapture(显式捕获);
  • 平衡组/递归匹配;
  • 其他内容:表7.尚未详细讨论的语法;

这些内容个人觉得相对高级,读了两遍有了一个大概的认识,后续有相关应用再予以深入。


应用实例:

[abc] a或b或c 
. 任意单个字符 
a? 零个或一个a
[^abc] 任意不是abc的字符 
\s 空格 
a* 零个或多个a
[a-z] a-z的任意字符 
\S 非空格 
a+ 一个或多个a
[a-zA-Z] a-z或A-Z 
\d 任意数字 
a{n} 正好出现n次a
^ 一行开头 
\D 任意非数字 
a{n,} 至少出现n次a
$ 一行末尾 
\w 任意字母数字或下划线 
a{n,m} 出现n-m次a
(...) 括号用于分组 
\W 任意非字母数字或下划线 
a*? 零个或多个a(非贪婪)
(a|b) a或b 
\b 单词边界 
(a)...\1 引用分组
(?=a) 前面有a 
(?!a) 前面没有a 
\B 非单词边界

import re

originstr = 'http://upos-sz-mirrorhw.bilivideo.com/upgcxcode/95/97/25aa6429795/256429795-1-32.flv?e=ig8euxZM2rNcNbN37zUVhoMgnwuBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1605519071&gen=playurl&os=hwbv&oi=737348678&trid=6dc40e32c716403881b67bf67f596472u&platform=pc&upsig=1a8747c29f3fbebd9754e8517eb2107c&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=0&orderid=0,3&agrr=1&logo=80000000'
# 匹配以/开头 以?结尾(由于两者是特殊标记 需要进行转义)的字符 且其中不包含/
bstr = r'\/([^\/]*)\?' 
b = re.compile(bstr ,  re.DOTALL)
str_list = b.findall(originstr)
print(str_list) 

按固定格式和位数提取字符串

bstr = r"""
  ^(?<recordType>[\w]{3,3})(?<senderType>[\w]{2,2})(?<senderId>\d{9,9})(?<senderName>[\x00-\xFF]{45,45})(?<ediStandard>[\x00-\xFF]{5,5})(?<creationDateTime>\d{14,14})(?<transmissionDate>\d{8,8})(?<characterSet>[\w\s]{0,15})"""

# 按固定格式提取字符串
b = re.compile(bstr ,  re.DOTALL)
str_list = b.match(content_str)

if str_list:
    linebits = str_list.groupdict()    
    for k, v in linebits.items() :
        # 去除解析之后的字符串的首尾空格
        linebits[k] = v.strip()
    return linebits

使用否定式前向查找提取字符串

import re

originstr = """
    <script>
        var liveUrl = "http://pull102.gzlz307.com/home/6d944f6ab72b3d069517146587a23c39/playlist.m3u8?only-audio=1";
        var liveId = "5190879905407162422";
        var liveStartTime = 1626761082249;
        var isSubscribed = !!0;
    </script>
"""

# 使用 否定式前向查找?! 来模拟逆向匹配:不包含某一字符串 的字符串 ((?!str).)*
bstr = r'liveUrl(((?!var).)*)var' 
b = re.compile(bstr ,  re.DOTALL)
str_list = b.findall(originstr)
print(str_list[0][0])

#  = "http://pull102.gzlz307.com/home/6d944f6ab72b3d069517146587a23c39/playlist.m3u8?only-audio=1";

对提取的日期进行判断是否是有效日期

import re

test_dates_str = """
19971-01-01
1960-00-00
1987-00-00
1981/05/20
1971-1-1
1971-1-0
"""

re_date_get = r'\d{4,5}[-/ ]\d{1,2}[-/ ]\d{1,2}'
re_date_normal = r'((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))'

test_dates = re.compile(re_date_get, re.DOTALL).findall(test_dates_str)

test_dates_dict = {}

for item in test_dates:
    s_item = re.compile(re_date_normal, re.DOTALL).search(item)
    if s_item:
        test_dates_dict[item] = s_item.group(0)
    else:
        test_dates_dict[item] = None
    
test_dates_dict

log:

{'19971-01-01': None,
 '1960-00-00': None,
 '1987-00-00': None,
 '1981/05/20': '1981/05/20',
 '1971-1-1': '1971-1-1',
 '1971-1-0': None}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则校验-我需要的正则表达式知识 的相关文章

  • 去除多余的0;正则表达式:去掉数字(整数、小数)前面多余的零

    方案1 来源 http zhidao baidu com question 277893180 html 如果是整数 去掉整数前的零 例如 0098765 gt 98765 如果是小数 去掉小数前的零 例如 000 333 gt 0 333
  • perl regex是什么_如何在Perl单行代码中使用Regex匹配多行

    perl regex是什么 Perl one liners with perl s regular expression statement can be a very powerful text processing tools used
  • java用正则表达式脱敏手机号

    一种正则形式 在Java开发中有时候需要对敏感字段数据脱敏 废话不多说 直接上代码 脱敏手机号 param str return 脱敏后字符串 public static String maskPhone String str return
  • 用Matlab作函数的图像

    函数简介 1 作图函数是plot 其调用格式如下 plot y plot x y plot x y LineSpec plot x1 y1 s1 x2 y2 s2 x3 y3 s3 说明 1 plot y 绘出以向量y为纵坐标 y的个元素的
  • JAVA 正则表达式 (超详细) .

    在Sun的Java JDK 1 40版本中 Java自带了支持正则表达式的包 本文就抛砖引玉地介绍了如何使用java util regex包 可粗略估计一下 除了偶尔用Linux的外 其他Linu x用户都会遇到正则表达式 正则表达式是个极
  • C语言的一个正则表达式pcre

    1 简介 在C C 中 一个比较好的正则表达式是pcre 被很多工具 包括一些商用工具 使用 2 源码下载 安装 2 1 下载 可以从官网http www pcre org 下载 为方便学习 已放在这里http download csdn
  • 常用数字电路模块之三:计数器与分频器(二))

    三 分频电路 1 简单的计数器 计数器实质是对输入的驱动时钟进行计数 所以计数器在某种意义上讲 等同于对时钟进行分频 例如一个最大计数长度为N 2 n 从0计数到N 1 的计数器 也就是寄存器位数位n 那么寄存器最高位的输出为N 2 n分频
  • 前端开发中常用的校验处理

    前端开发中常用的校验处理 1 手机号码校验 2 身份证正则校验 3 必须输入中文 必须输入英文 4 其它正则校验 1 手机号码校验 function checkPhone var phone document getElementById
  • 人人都看得懂的正则表达式教程

    编写验证规则最流行和最简单的方法就是正则表达式了 但唯一的一个问题是正则表达式的语法太隐晦了 让人蛋疼无比 很多开发者为了在项目中应用复杂的验证 经常要使用一些小抄来记住正则式的复杂语法和各种常用命令 在这篇文章中 我将试图让大家明白什么是
  • 正则表达式大全

    1 匹配中文 u4e00 u9fa5 2 英文字母 a zA Z 3 数字 0 9 4 匹配中文 英文字母和数字及下划线 u4e00 u9fa5 a zA Z0 9 同时判断输入长度 u4e00 u9fa5 a zA Z0 9 4 10 5
  • 常用js

    1 去掉字符串两端的空格 对字符串去两端空格 function stringTrim str if str null str undefined return null 用正则表达式将前后空格 用空字符串替代 return str repl
  • 【PAT乙级】旧键盘打字

    题目描述 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中对应英文字母的坏键以大
  • SparkSQL HiveSQL 常用正则表达式

    SparkSQL HiveSQL 常用正则表达式 目录 SparkSQL HiveSQL 常用正则表达式 1 匹配汉字 2 匹配手机号码 3 匹配身份证 4 SparkSQL HiveSQL 常用正则函数 5 SparkSQL 分组 聚合
  • Java的replaceAll()方法

    replaceAll 方法实际是采用正则表达式的规则去匹配的 在regex中 表示一个 在java中一个 也要用 表示 这样 前一个 代表regex中的 后一个 代表java中的 所以字符串转义一次 正则转义一次 那么一个斜扛要写4个 1
  • Python3 如何优雅地使用正则表达式(详解五)

    非捕获组命名组 精心设计的正则表达式可能会划分很多组 这些组不仅可以匹配相关的子串 还能够对正则表达式本身进行分组和结构化 在复杂的正则表达式中 由于有太多的组 因此通过组的序号来跟踪和使用会变得困难 有两个新的功能可以帮你解决这个问题 非
  • js常用正则表达式 匹配多个汉字、数字、英文、所有字符(附带Layui中form的表单验证)

    常用正则表达式 转自 菜鸟工具 https c runoob com front end 854 一 校验数字的表达式 数字 0 9 n位的数字 d n 至少n位的数字 d n m n位的数字 d m n 零和非零开头的数字 0 1 9 0
  • js正则表达式

    w3school 正则表达式 一 正则表达式的使用 首先 我们一般使用正则表达式用来进行验证邮箱手机号等 进行匹配 1 编写一个正则表达式 var rule 我是一个正则表达式 2 使用正则表达式来进行验证 var isrule rule
  • 正则表达式工具类

    在实际开发中总会使用到正则表达式匹配数据 我也是在后面查看了一些资料 下面写一个常用的正则表达式匹配集合 正则匹配模式 表示匹配字符串的开始位置 例外 用在中括号中 时 可以理解为取反 表示不匹配括号中字符串 表示匹配字符串的结束位置 表示
  • 天梯赛字符串替换题 “ 6翻了” Python 正则表达式替换

    输入格式 输入在一行中给出一句话 即一个非空字符串 由不超过 1000 个英文字母 数字和空格组成 以回车结束 输出格式 从左到右扫描输入的句子 如果句子中有超过 3 个连续的 6 则将这串连续的 6 替换成 9 但如果有超过 9 个连续的
  • Python 正则表达式指南

    文章目录 1 正则表达式基础 1 1 简单介绍 1 2 数量词的贪婪模式与非贪婪模式 1 3 反斜杠的困扰 1 4 匹配模式 2 re模块 2 1 开始使用re 2 2 Match 2 3 Pattern 1 正则表达式基础 1 1 简单介

随机推荐

  • 修改镜像源和修改PATH

    ls a 显示所有文件夹 这里就有我们需要的bashrc 修改path 和condarc 修改镜像 vim bashrc or condarc 打开文件 直接摁i进入修改模式 进行修改 修改完以后esc wq 确认保存退出就好了
  • qt opengl 2d纹理数组

    2d纹理数组就是用一个纹理数组类型的变量保存数个纹理 这样就避免了使用多个单个的纹理对象 这再批处理一系列相同大小的纹理时 非常有用 我这里用到的场景是在点精灵中使用纹理数组使得每个精灵纹理上不同的图案 我用的图片有16张 当顶点为16个时
  • 单片机c51 单一外中断的应用

    1 在51单片机的P1接口上有8只LED 在外部中断0输入引脚P3 2 INT0 引脚接有一只按钮开关K1 程序要求将外部中断0设置成负跳沿触发 程序启动时 P1口上的8只LED亮 按一次开关按钮K1 使引脚接地 产生一个负跳沿触发的外部中
  • python os.walk读取路径下文件名

    import os dir path C for root dirs files in os walk dir path for file in files print os path join root file if file len
  • android自定义view之地图(一)

    最近参加了一个比赛 要用到自己做一个自定义的小地图 所以在网上查找了一些关于自定义view的有关资料 也了解了自定义控件的初步知识 效果图 第一阶段我画了一个自制的网格图 点哪个网格就会哪个网格就会显示 工作环境图 代码介绍 1 我们都知道
  • Qt之QProcess(一)运行cmd命令

    Qt提供了QProcess类 QProcess可用于完毕启动外部程序 并与之交互通信 一 启动外部程序的两种方式 1 一体式 void QProcess start const QString program const QStringLi
  • python3 题解(47 定义有理数类)

    有理数类 问题 浮点数的运算很多时候都是近似的 因为计算机无法表示一个无限的小数 有理数总可以表示为整数的比值 并且有理数的四则运算结果还是一个有理数 除0除外 如果是有四则运算 则可以考虑用有理数表示 这样可以没有舍入误差 分析 记录一个
  • Markdown基础

    Markdown学习 标题 N个 空格 二级标题 三级标题 字体 Hello World 两边都加2个 就变成粗体 Hello World 两边都加1个 就变成斜体 Hello World 两边都加3个 就变粗斜体 Hello World
  • css世界读书笔记->line-height(1)

    如果 line height 的值是1 5 font size大小是14px 那么半行距的大小是 14px 4 5 14px 2 3 5px border及line height等传统css属性没有小数的概念 因此3 5px需要取整处理 1
  • 基于卷积神经网络-门控循环单元结合注意力机制(CNN-GRU-Attention)时间序列预测,单列数据输入模型。matlab代码,2020版本及以上。评价指标包括:R2、MAE、MSE、RMSE

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 tic restoredefaultpath 导入数据 f xlsread windspeed xls She
  • sql server学习笔记——批处理语句、存储过程

    目录 批处理语句 1 批处理语句简介 示例一 示例二 存储过程 一 什么是存储过程 1 存储过程的简介 2 存储过程包含的内容 3 存储过程的优点 4 存储过程的分类 系统存储过程 用户定义存储过程 5 常用的系统储存过程 1 一般常用的存
  • 专访帝国软件的创造者:仍然在路上的80后

    全球的网站数量已经超过了一亿 并且还在以惊人的速度继续增长 CMS作为一种位于Web前端 Web 服务器 和后端办公系统或流程 内容创作 编辑 之间的软件系统为互联网应用的丰富和发展起到了至关重要的作用 最近我们注意到有一款口碑很好的CMS
  • Yii2 选择布局的方式

    方案1 控制器内成员变量 public layout false 不使用布局 public layout main 设置使用的布局文件 方案2 控制器成员方法内 this gt layout false 不使用布局 this gt layo
  • EMC 电磁兼容知识简易解析

    EMC基础知识 电磁兼容性 EMC Electromagnetic Compatibility 设备在共同的电磁环境中能一起执行各自功能的共存状态 即该设备不会由于受到处于同一电磁环境中其他设备的电磁发射导致不允许的降级 也不会使同一电磁环
  • iphone或安卓配置Charles抓包

    4个步骤完成iPhone配置Charles抓包步骤 Charles官网下载地址 Download a Free Trial of Charles Charles Web Debugging Proxy 1 连接到wifi 并设置代理地址 可
  • React传递参数的多种方式

    最常见的就是父子组件之间传递参数 父组件往子组件传值 直接用this props就可以实现 在父组件中 给需要传递数据的子组件添加一个自定义属性 在子组件中通过this props就可以获取到父组件传递过去的数据 父组件 render re
  • K-means算法的参数详解

    参数名称 默认值及输入类型 参数解释 algorithm 默认 Auto 有auto full和elkan三种选择 algorithm 优化算法的选择 有auto full和elkan三种选择 full就是一般意义上的K Means算法 e
  • java.security.InvalidKeyException: Illegal key size错误

    新使用了AES的256位密钥加解密 项目上线后发现生产在加密的时候报java security InvalidKeyException Illegal key size错误 而本地和测试环境都是没问题的 产生错误原因 为了数据代码在传输过程
  • 求生之路显示服务器指令大全手机,求生之路2指令大全 求生之路2指令怎么用? (7) _地图指令_游侠网...

    地图指令 c1m1 hotel 1 死亡中心1旅馆 c1m2 streets 1 死亡中心2街道 c1m3 mall 1 死亡中心3购物中心 c1m4 atrium 1 死亡中心4中厅 c2m1 highway 1 黑色狂欢节1高速公路 c
  • 正则校验-我需要的正则表达式知识

    正则校验 我需要的正则表达式知识 正则表达式由正则表达式引擎提供支持 不同编程环境有不同的正则表达式引擎 在实际使用正则表达式的过程中会有一些差别 什么是正则表达式 正则表达式是用于描述匹配复杂字符串规则的工具 一个正则表达式对应着一个文本