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)基本语法及概念的更多相关文章

  1. C#正则表达式快速入门

    作者将自己在学习正则表达式中的心得和笔记作了个总结性文章,希望对初学C#正则表达式的读者有帮助. [内容] 什么是正则表达式 涉及的基本的类 正则表达式基础知识 构建表达式基本方法 编写一个检验程序 ...

  2. Vue 1-- ES6 快速入门、vue的基本语法、vue应用示例,vue基础语法

    一.ES6快速入门 let和const let ES6新增了let命令,用于声明变量.其用法类似var,但是声明的变量只在let命令所在的代码块内有效. { let x = 10; var y = 2 ...

  3. c语言快速入门2

    如果你想快速入门计算机,可以参考我的上一篇帖子,先了解一些必备的软知识,然后再来进行语言的快速入门 计算机入门基础知识 c语言快速入门1 1.1.12 函数的概念 函数的定义:c语言的基本单位,c语言 ...

  4. vue 快速入门 系列 —— vue loader 下

    其他章节请看: vue 快速入门 系列 vue loader 下 CSS Modules CSS Modules 是一个流行的,用于模块化和组合 CSS 的系统.vue-loader 提供了与 CSS ...

  5. 快速入门pandas进行数据挖掘数据分析[多维度排序、数据筛选、分组计算、透视表](一)

    1. 快速入门python,python基本语法 Python使用缩进(tab或者空格)来组织代码,而不是像其 他语言比如R.C++.Java和Perl那样用大括号.考虑使用for循 环来实现排序算法 ...

  6. Linux快速入门02-文件系统管理

    继续进入Linux文件系统的学习,加油,早日突破MS压在自己身上的那道束缚. Linux系列文章 快速入门系列--Linux--01基础概念 快速入门系列--Linux--02文件系统管理 快速入门系 ...

  7. git 快速入门及常用命令

    身为技术人员,都知道Git是干嘛的.从服务端角度它是代码仓库,可以多人协作.版本控制.高效处理大型或小型项目所有内容:从客户端讲,它能够方便管理本地分支.且与服务端代码的同步,从拉取.合并.提交等等管 ...

  8. [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门

    [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门 1. 什么是正则表达式? 1.1 正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简 ...

  9. 转:C++ Boost/tr1 Regex(正则表达式)快速指南

    C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...

  10. shell脚本快速入门----正则表达式

    一. "." 符号 (一个英文句号) 用于匹配换行符之外的任意一个字符 如 root 可用r..t来匹配 二. "*"符号 重复匹配前一个字符 如ab abc ...

随机推荐

  1. 实例讲解Spring boot动态切换数据源

    摘要:本文模拟一下在主库查询订单信息查询不到的时候,切换数据源去历史库里面查询. 本文分享自华为云社区<springboot动态切换数据源>,作者:小陈没烦恼 . 前言 在公司的系统里,由 ...

  2. LeetCode 周赛 347(2023/05/28)二维空间上的 LIS 最长递增子序列问题

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 往期回顾:LeetCode 单周赛第 346 场 · 仅 68 人 AK 的最短路问题 周赛 347 概览 ...

  3. ImageIO的应用

    ImageIO的应用 一.关于IO流 在讲imageio之前,我们先来复习一下IO流的使用. 这里我建立一个Java类,用来实现读取文档中的内容,并且能够识别换行,话不多说,上代码: package ...

  4. 深入探索C++对象模型(Inside the C++ object model) -- 摘阅笔记(关于对象 - esp 1)

    Object Lessons 关于对象 在C语言中,"数据"和"处理数据的操作(函数)"是分开声明的,也就是说 ,语言本身并没有支持"数据和函数&qu ...

  5. C++面试八股文:什么是RAII?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第13面: 面试官:什么是RAII? 二师兄:RAII是Resource Acquisition Is Initialization的缩写.翻译成中文 ...

  6. NSDI-2023 微软论文:解构有状态网络功能

    本文通过chatgpt代理站(支持gpt4):gptschools.cn翻译整理 微软Azure对每个虚拟机进行了为期三个月的网络监控,获得了新建.并发.PPS等指标情况,发现: 1) 网络功能负载不 ...

  7. 整理spring-web里支持的文件以及对应的Content-Type

    前言 最近在弄文件上传.下载.在线预览时经常需要设置请求标头或者响应标头的Content-Type 属性.所以研究了一下spring支持哪些Content-Type,通过研究MediaTypeFact ...

  8. Linux系统运维之FastDFS集群部署

    一.简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.FastDFS服务端有两个 ...

  9. GO web学习(二)

    跟着b站https://space.bilibili.com/361469957 杨旭老师学习做的笔记 Response响应 ResponseWriter 包括Writer,WriterHeader, ...

  10. 推荐一款C#开源的操作简单、免费的屏幕录制和GIF动画制作神器

    前言 今天要给大家推荐一款由C#语言开发且开源的操作简单.免费的屏幕录制和GIF动画制作神器:ScreenToGif . 工具介绍 ScreenToGif 是一款免费的开源屏幕录制和GIF 制作工具. ...