我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么查看正则表达式的AST

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么查看正则表达式的AST

这篇文章主要为大家展示了“怎么查看正则表达式的AST”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么查看正则表达式的AST”这篇文章吧。

字符串的处理基本都会用正则表达式,用它来做字符串的匹配、提取、替换等很方便。

但是正则表达式的学习还是有些难度的,比如贪婪匹配、非贪婪匹配、捕获子组、非捕获子组等概念,不止初学者难理解,有很多工作几年的人都不理解。

那正则表达式怎么学比较好?怎么快速掌握正则表达式呢?

正则表达式的匹配原理是把模式串 parse 成 AST,然后通过这个 AST 去匹配目标字符串。

模式串中的各种信息在 parse 之后都会保存在 AST 里面。AST 是 abstract syntax tree,抽象语法树的意思,顾名思义,是按照语法结构组织的一棵树,那么从 AST 的结构上自然可以轻易的知道正则表达式支持的语法。

怎么查看正则表达式的 AST 呢?

可以通过 astexplorer.net 这个网站来可视化的查看:

怎么查看正则表达式的AST

切换 parse 的语言为 RegExp,就可以做正则表达式的 AST 的可视化。

就像前面所说,AST 是按照语法来组织的一棵树,那么从它的结构上自然能容易地理清各种语法。

那么我们就从 AST 的角度来学习下各种语法吧:

/abc/

先从简单的开始,/abc/ 这样一个正则就可以匹配 'abc' 的字符串,它的 AST 是这样的:

怎么查看正则表达式的AST

3 个 Char,值分别是 a、b、c,类型是 simple。那之后的匹配就是遍历 AST,分别匹配这三个字符了。

我们用 exec 的 api 测试了下:

怎么查看正则表达式的AST

第 0 个元素是匹配的字符串,index 是匹配字符串的开始下标。input 是输入的字符串。

再来试下特殊的字符:

/\d\d\d/

/\d\d\d/ 是匹配三个数字的意思,\d 是正则支持的有特殊含义的元字符(meta char)。

通过 AST 我们也可以看出来,它们虽然也是 Char,但类型确是 meta:

怎么查看正则表达式的AST

可以通过 \d 的元字符来匹配任意数字:

怎么查看正则表达式的AST

哪些是 meta char 哪些是 simple char,通过 AST 来看一目了然。

/[abc]/

正则支持通过 [] 的方式来指定一组字符,也就是说匹配其中任意一种字符都行。

通过 AST 我们也可以看出来,它被包裹了一层 CharacterClass,就是字符类的意思,也就是匹配它包含的任意一种字符都行。

怎么查看正则表达式的AST

测试下也确实是这样:

怎么查看正则表达式的AST

/a{1,3}/

正则表达式支持指定某个字符重复多少次,用 {from,to} 的形式,

比如 /b{1,3}/ 表示字符 b 重复 1 到 3 次,/[abc]{1,3}/ 表示这个 a/b/c 字符类重复 1 到 3 次。

通过 AST 可以看出来,这种语法叫做 Repetition(重复):

怎么查看正则表达式的AST

他有个 quantifier 的属性表示量词,这里的类型是 range,从 1 到 3。

正则也支持一些量词的简写,比如 + 表示 1 到无数次、* 表示 0 到无数次、? 表示 0 或 1 次。

分别是不同类型的量词:

怎么查看正则表达式的AST

有同学可能会问,这里的 greedy 属性是啥意思呢?

怎么查看正则表达式的AST

greedy 是贪婪的意思,这个属性就表示这个 Repetition 是贪婪匹配还是非贪婪匹配。

如果在量词后加个 ?,你就会发现 greedy 变成 false 了,也就是切换到了非贪婪匹配:

怎么查看正则表达式的AST

那贪婪和非贪婪是指啥呢?

我们看个例子就知道了。

怎么查看正则表达式的AST

默认 Repetition 的匹配是贪婪的,只要满足条件就一直匹配下去,所以这里 acbac 都能匹配到。

量词后加个 ? 就切换到了非贪婪,就只会匹配第一个了:

怎么查看正则表达式的AST

这就是贪婪匹配和非贪婪匹配,通过 AST 我们能够清楚的知道贪婪和非贪婪是针对重复语法来说的,默认是贪婪匹配,在量词后加个 ? 就可以切换到非贪婪。

(aaa)bbb(ccc)

正则表达式支持通过()把匹配到的一部分字符串放到子组里返回。

通过 AST 看一下:

怎么查看正则表达式的AST

对应的 AST 就叫做 Group。

而且你会发现它有个 capturing 的属性,默认是 true:

怎么查看正则表达式的AST

这是啥意思呢?

这就是子组捕获的语法。

如果不想捕获子组,可以这样写 (?:aaa)

怎么查看正则表达式的AST

看,capturing 变为 false 了。

那捕获和非捕获有什么区别呢?

我们试一下:

怎么查看正则表达式的AST

哦,原来 Group 的 capturing 属性代表的是是否提取的意思啊。

我们通过 AST 可以看出来,捕获是针对子组来说的,默认是捕获,也就是提取子组的内容,可以通过 ?: 切换到非捕获,就不会提取子组的内容了。

我们对用 AST 来了解正则语法已经轻车熟路了,那来看点难的:

/bbb(?=ccc)/

正则表达式支持通过 (?=xxx) 的语法来表示先行断言,用来判断某个字符串是否前面是某个字符串。

通过 AST 可以看到这种语法叫做 Assertion,并且类型为 lookahead,也就是往前看,只匹配前面的意思:

怎么查看正则表达式的AST

这是啥意思呢?为啥要这么写?和 /bbb(ccc)/ 还有 /bbb(?:ccc)/有啥区别呢?

我们试一下:

怎么查看正则表达式的AST

从结果可以看出来:

/bbb(ccc)/ 匹配了 ccc 的子组并且提取出来了这个子组,因为默认子组是捕获的。

/bbb(?:ccc)/ 匹配了 ccc 的子组但没有提取出来,因为我们通过 ?: 设置了子组不捕获。

/bbb(?=ccc)/ 匹配了 ccc 的子组也没有提取出子组,说明也是非捕获的。它和 ?: 的区别是 ccc 没有出现在匹配结果里。

这就是先行断言(lookahead assertion)的性质:先行断言代表某段字符串前面是某段字符串,对应的子组是非捕获的,而且断言的字符串不会出现在匹配结果中。

如果后面不是跟着那段字符串就不匹配:

怎么查看正则表达式的AST

/bbb(?!ccc)/

把 ?= 改成 ?! 之后意思就变了,通过 AST 看一下:

怎么查看正则表达式的AST

虽然还是先行断言 lookahead assertion,但是多了个 negative 为 true 的属性。

这个意思很明显,本来是前面是某段字符串,否定之后就是前面不是某段字符串。

那匹配结果正好就反过来了:

怎么查看正则表达式的AST

现在前面不是某段字符串的话才匹配了,这就是否定先行断言。

/(?<=aaa)bbb/

有先行断言自然也有后行断言,也就是后面是某段字符串才匹配。

怎么查看正则表达式的AST

同理,也可以否定:

怎么查看正则表达式的AST

(?<=aaa)对应的 AST 很容易想到,就是 lookbehind assertion:

怎么查看正则表达式的AST

(?<!aaa)对应的 AST 就是加个 negative 属性:

怎么查看正则表达式的AST

以上是“怎么查看正则表达式的AST”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么查看正则表达式的AST

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL 正则表达式查询

MySQL REGEXP:正则表达式正则表达式主要用来查询和替换符合某个模式(规则)的文本内容。例如,从一个文件中提取电话号码,查找
2023-02-03

在python正则表达式中是怎样正确使用正则表达式

这篇文章将为大家详细讲解有关在python正则表达式中是怎样正确使用正则表达式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。现在我们已经看了一些简单的正则表达式,那么我们实际在 Python
2023-06-17

python的正则表达式怎么用

这篇文章主要为大家展示了“python的正则表达式怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python的正则表达式怎么用”这篇文章吧。一、正则表达式–元字符re 模块使 Python
2023-06-25

notepad怎么写正则表达式

这篇文章给大家分享的是有关notepad怎么写正则表达式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问题描述:这个正则表达式用notepad++怎么写?原文本:
2023-06-21

Flex正则表达式怎么用

这篇文章主要为大家展示了“Flex正则表达式怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Flex正则表达式怎么用”这篇文章吧。Flex正则表达式学习一般来说各个开发环境或者语言对于Fle
2023-06-17

VB.NET正则表达式怎么用

小编给大家分享一下VB.NET正则表达式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、引言在通常的程序设计中,对字符串的操作是不可缺少的部分。例如,我们
2023-06-17

MongoDB中正则表达式查询怎么实现

在MongoDB中,可以使用正则表达式来进行模糊查询。在查询条件中使用$regex操作符可以实现正则表达式查询。下面是一个简单的示例:db.collection.find({ field: { $regex: /pattern/ } })
MongoDB中正则表达式查询怎么实现
2024-04-19

Shell正则表达式怎么用

这篇文章将为大家详细讲解有关Shell正则表达式怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、正则表达式是什么?正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、
2023-06-09

mysql正则表达式怎么用

mysql正则表达式用于模式匹配,通过regexp操作符将正则表达式与字符串进行比较。其语法为:select field from table where field regexp 'pattern'。mysql支持各种正则表达式元字符,包
mysql正则表达式怎么用
2024-06-02

js正则表达式和php正则表达式有什么区别

区别:1、PHP正则表达式支持“(?<!”和“(?<=”断言,而js正则表达式不支持;2、PHP正则表达式支持子组“(?R)”,而js正则表达式不支持;3、PHP正则表达式支持本地编码,js只支持unicode。
2017-12-02

正则表达式空格怎么表示

正则表达式中表示空格的符号是 `\s`,它可以匹配任意空白字符,包括空格、制表符、换行符等。如果要匹配一个空格字符,可以直接使用空格字符本身。例如,正则表达式 `hello\sworld` 可以匹配字符串 `"hello world"`,其
2023-06-13

正则表达式怎么表示数字

正则表达式可以用来表示数字的方法有以下几种:1. 表示任意数字:\d,表示匹配任意一个数字字符。2. 表示零或多个数字:\d*,表示匹配零个或多个数字字符。3. 表示至少一个数字:\d+,表示匹配至少一个数字字符。4. 表示指定个数的数字:
2023-08-15

编程热搜

目录