正则表达式快速入门一:正则表达式(regex)基本语法及概念
Regex quickstart :正则表达式快速入门
author: wclsn
reference quick start
如果想要了解正则表达式的基本概念且英文ok的话,完全可以从我上面所附网站的quickstart看起。如果仅仅只是想快速入门并用起来,那么在看完quickstart 之后,可以看这个网站上对应编程语言中正则表达式的使用;如果想要对于quickstart中的语法特性做进一步的学习,那么可以看这个网站上相应语法 topic的tutorial
这篇随笔主要是写我在看完 上面所附quick start 之后的一些想法, 对于上面所附的教程中所附的概念做了一些组织
Intro
正则表达式:regular expression 常常简写为regex,是用于表示text pattern的表达式(一组字符串), 主要用于在目标文本中实现高效的文本匹配
Regular Expression Engine: 一个 regex engine 是能够处理正则表达式的代称,它能够在给定字符串中匹配特定的pattern(match the pattern to the given string)。通常而言 engine是一些更大的应用的一部分,并且一般你不直接访问engine
就正如软件世界的许多软件一样,不同的正则表达式 engine并不一定是彼此兼容的。某个engine的语法(syntax)或者行为(behavior) 被称为 regex flavor。有许多 regex flavor: 比如 python js perl php posix等等
匹配:最简单的匹配即直接使用 literal text(字对字的匹配),这也是一种最为简单的正则表达式。但这种匹配不够灵活,冗余度也过高,因此需要对字符串的结构进行抽象,引入特殊的运算符,来实现更有效的匹配。
字符层级的抽象
字符串的基本组成单位是字母(Literal Characters),正则表达式匹配的基础也是Literal characters, 比如说 a 会匹配字符串中的a。为了添加相应的运算符,正则表达式中有12个字符(metacharacters)具有特殊的含义,若要使用它们的原义(as a literal character)需要经过转义
为了扩大符号匹配的范围(enlarge the character class),正则表达式提供了对于 non-printable characters(例如tab 回车 esc等) 以及unicode 字符、十六进制字符集的支持
同时为了实现精准的字符匹配,正则表达式支持 Character Classes,即对于待匹配字符提供一个备选的集合 例如gr[A-Za-z]y 或者gr[ae]y。 针对这个集合又定义了一些运算(如^)
对于常见的字符集(如数字集,或者字母数字集等),regex提供了相应的简写(shorthand character class) 如\d 表示数字, \w表示字母数字字符加下划线, \s匹配whitespace character
同时 regex还提供了一种特殊的字符 . ,Dot match almost any character, 当然应该尽量少使用 . 在一般情况下字符集或者非字符集(negated character class)更快也更精确
由字符扩展至字符串
Repetition: * 算符或者 + 算法会重复匹配前一个字符, 结合character class使用可以用于匹配同类型的字符组合(如邮件 网址等), 同时还可以用 {} 指定重复匹配的次数, 比如 []+{3} 或者 []+{2, 4} ; 将 dot 和 + 结合起来可以实现 greedy or lazy repetition
Grouping and Capturing: 使用圆括号将许多字符变成一个匹配对象,将其作为一个整体参与匹配。同时我们也可以对于group 添加量词 (如?)
grouping will create capturing groups : 因此我们可以复用 capturing groups 中的内容。如用反向引用(backreference)
在由多个group 时,增加可读性的方法往往是对于group进行命名
很多时候,我们并不需要group的匹配结果,而是需要使用group是否匹配作为匹配的条件。Lookaround是一种特殊的group,包括Lookahead and lookbehind, 例如 q(?=u) 以及 (?<=a)bc
Alternation:在匹配字符串的时候 正则表达式还提供了|运算符, 如 cat|dog 需要注意的是, |具有最低的运算优先级
匹配位置的指定
Anchor:这类字符对于匹配的位置进行锚定(比如 ^ 和 $) 以及 \b 与 \B
表达式的可读性
为了表达式的可读性,在许多应用中提供了 free-spacing or ignore-whitespace or comment选项。 这样 regex engine 就会忽略表达式中的空格以及换行符, 同时# 提供了单行注释的功能。
在上述功能的加持下正则表达式的可读性以及可维护性会有显著的提升
至于具体的语法细节请参阅 所附reference网址, 在写作过程中难免会有所纰漏,如果有什么错误请及时联系我修改
正则表达式快速入门一:正则表达式(regex)基本语法及概念的更多相关文章
- C#正则表达式快速入门
作者将自己在学习正则表达式中的心得和笔记作了个总结性文章,希望对初学C#正则表达式的读者有帮助. [内容] 什么是正则表达式 涉及的基本的类 正则表达式基础知识 构建表达式基本方法 编写一个检验程序 ...
- Vue 1-- ES6 快速入门、vue的基本语法、vue应用示例,vue基础语法
一.ES6快速入门 let和const let ES6新增了let命令,用于声明变量.其用法类似var,但是声明的变量只在let命令所在的代码块内有效. { let x = 10; var y = 2 ...
- c语言快速入门2
如果你想快速入门计算机,可以参考我的上一篇帖子,先了解一些必备的软知识,然后再来进行语言的快速入门 计算机入门基础知识 c语言快速入门1 1.1.12 函数的概念 函数的定义:c语言的基本单位,c语言 ...
- vue 快速入门 系列 —— vue loader 下
其他章节请看: vue 快速入门 系列 vue loader 下 CSS Modules CSS Modules 是一个流行的,用于模块化和组合 CSS 的系统.vue-loader 提供了与 CSS ...
- 快速入门pandas进行数据挖掘数据分析[多维度排序、数据筛选、分组计算、透视表](一)
1. 快速入门python,python基本语法 Python使用缩进(tab或者空格)来组织代码,而不是像其 他语言比如R.C++.Java和Perl那样用大括号.考虑使用for循 环来实现排序算法 ...
- Linux快速入门02-文件系统管理
继续进入Linux文件系统的学习,加油,早日突破MS压在自己身上的那道束缚. Linux系列文章 快速入门系列--Linux--01基础概念 快速入门系列--Linux--02文件系统管理 快速入门系 ...
- git 快速入门及常用命令
身为技术人员,都知道Git是干嘛的.从服务端角度它是代码仓库,可以多人协作.版本控制.高效处理大型或小型项目所有内容:从客户端讲,它能够方便管理本地分支.且与服务端代码的同步,从拉取.合并.提交等等管 ...
- [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门
[.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门 1. 什么是正则表达式? 1.1 正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简 ...
- 转:C++ Boost/tr1 Regex(正则表达式)快速指南
C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...
- shell脚本快速入门----正则表达式
一. "." 符号 (一个英文句号) 用于匹配换行符之外的任意一个字符 如 root 可用r..t来匹配 二. "*"符号 重复匹配前一个字符 如ab abc ...
随机推荐
- 《数据结构》之栈和堆结构及JVM简析
导言: 在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代? 一.程序在内存中的 ...
- ffuf的使用
ffuf:模糊测试 使用 ffuf 进行枚举.模糊测试和目录暴力破解 安装 https://github.com/ffuf/ffuf 建议:https://github.com/danielmiess ...
- 深入分析:Lasso问题和原子范数问题研究
写在前面 本文将主要围绕Lasso问题和原子范数等经典问题进行对偶问题的推导.分析,由于笔者的数理基础浅薄,下面的证明过程若存在错误,欢迎评论指正. LASSO问题 推导 问题定义:\(\unde ...
- 有关 python 切片的趣事
哈喽大家好,我是咸鱼 今天来讲一个我在实现 python 列表切片时遇到的趣事 在正式开始之前,我们先来了解一下切片(slice) 切片操作是访问序列(列表.字符串......)中元素的另一种方法,它 ...
- 龙芯下如何进行.net core程序开发部署
龙芯LoongArch64已经发布了对.NETCore的支持,相关工具链也已完成,目前支持.NETCore3.1..NET6..NET7版本.本文以.NETCore3.1在loongnix-serve ...
- Java使用joml计算机图形学库,将3D坐标旋转正交投影转为2D坐标
最近遇到了一个困扰我许久的难题,现将解决方案分享出来 由于我们的项目侧重点在前端绘图,导致了前后端工作量不协调,我后端接口很快就能写完,而前端一个图要画好久,领导见状将前端的任务分到后端一部分用Jav ...
- 基于Sa-Token实现微服务之前的单点登录
修改配置文件,准备好四个域名 127.0.0.1 auth.server.com 127.0.0.1 user.server.com 127.0.0.1 third.server.com 127.0. ...
- C++面试八股文:如何实现一个strncpy函数?
某日二师兄参加XXX科技公司的C++工程师开发岗位第31面: 面试官:strcpy函数使用过吧? 二师兄:用过. 面试官:这个函数有什么作用? 二师兄:主要用做字符串复制,将于字符从一个位置复制到另一 ...
- AI重塑千行百业,华为云发布盘古大模型3.0和昇腾AI云服务
[中国,东莞,2023年7月7日]华为开发者大会2023(Cloud)7月7日在中国东莞正式揭开帷幕,并同时在全球10余个国家.中国30多个城市设有分会场,邀请全球开发者共聚一堂,就AI浪潮之下的产业 ...
- 微信小程序生态15- 批量提交微信小程序审核的一种方式
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教. 以下是『微信小程序生态系列文章』正文! 需求背景 ...