正则表达式浅谈(regex without tears)

亨利·斯宾塞(Henry Spencer)的Regexp引擎再探 基于Henry Spencer早期工作的小型,可识别Unicode的正则表达式引擎 立即下载

    正则表达式(Regular Expression),在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。它功能强大,是“通用的模式语言”,描述能力很强。

    完整的正则表达式有两种字符组成:元字符和字符。其实正则表达式对字符串的操作就相当于SQL语句对数据库的操作一样,将其进行类比可以更加形象的理解正则表达式。元字符其实相当于SQL语句中的SELECT、WHERE之类,而字符就相当于表Student、No 之类。如例 ^cat$ 表示将匹配“某行以cat为全部内容的字符串”。

    不同的语言以不同的方式来实现和使用这种语言。例如,在Perl中就内建了一个功能强大的正则表达式引擎。Perl正则表达式源自于Henry Spencer写的regex,它已经演化成了PCRE。以下是在PCRE中元字符及其在正则表达式上下文中的行为的一个列表:

字符

描述

/

将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“/n”匹配一个换行符。序列“//”匹配“/”而“/(”则匹配“(”。

^    匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“/n”或“/r”之后的位置。

$    匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“/n”或“/r”之前的位置。

*    匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。

+    匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。

?    匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。

{n}    n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。

{n,}    n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

{n,m}    m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。

?    当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。匹配除“/n”之外的任何单个字符。要匹配包括“/n”在内的任何字符,请使用像“[./n]”的模式。

(pattern)     匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“/(”或“/)”。

(?:pattern)     匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用“或”字符(|)来组合一个模式的各个部分是很有用。例如,“industr(?:y|ies)就是一个比”industry|industries'更简略的表达式。

(?=pattern)     正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)     负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

x|y     匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。

[xyz]     字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。

[^xyz]     负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。

[a-z]      字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。

[^a-z]     负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。

/b     匹配一个单词边界,也就是指单词和空格间的位置。例如,“er/b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。

/B     匹配非单词边界。“er/B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

/cx     匹配由x指明的控制字符。例如,/cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。

/d     匹配一个数字字符。等价于[0-9]。

/D     匹配一个非数字字符。等价于[^0-9]。

/f     匹配一个换页符。等价于/x0c和/cL。

/n     匹配一个换行符。等价于/x0a和/cJ。

/r     匹配一个回车符。等价于/x0d和/cM。

/s     匹配任何空白字符,包括空格、制表符、换页符等等。等价于[/f/n/r/t/v]。

/S     匹配任何非空白字符。等价于[^/f/n/r/t/v]。

/t     匹配一个制表符。等价于/x09和/cI。

/v     匹配一个垂直制表符。等价于/x0b和/cK。

/w    匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。

/W    匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。

/xn    匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“/x41”匹配“A”。“/x041”则等价于“/x04”&“1”。正则表达式中可以使用ASCII编码。.

/num     匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)/1”匹配两个连续的相同字符。

/n      标识一个八进制转义值或一个向后引用。如果/n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。

/nm      标识一个八进制转义值或一个向后引用。如果/nm之前至少有nm个获得子表达式,则nm为向后引用。如果/nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则/nm将匹配八进制转义值nm。

/nml     如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。

/un        匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,/u00A9匹配版权符号(?)。

    就正则表达式的匹配工作原理而言,较为深奥、繁杂,但是有两条普适的原则:1.优先选择最左端(最靠开头)的匹配结果;2.标准的匹配量词(* + ? {})是匹配优先的。

    正则表达式也有自己的术语集合:

        正则:其本身简称。

        匹配:一个正则表达式匹配一个字符串,其实是指这个正则表达式能在字符串中找到匹配文本。

        元字符:如上解释。

        版本:不同的工具使用不同的正则表达式完成不同的任务,每样工具支持的元字符和其他特性都不相同,这就形成了差异。

        字表达式:指的是整个正则表达式的一部分,通常是括号内的表达式,或是由“|”分隔的多个分支。

字符:如上解释。

    Perl、Java、.NET等语言都提供了对正则表达式的支持,但支持的粒度和细节各不相同。就Java而言,自2002年发布的Java 1.4以后,Java就内建了正则表达式包,即 java.util.regex ,其所提供的API简单而有用,提供了强大的功能,运行速度快。通过 java.tuil.reges 使用正则表达式非常简单,功能由两个类,一个接口和一个 unchecked exception 组成。如下

java.util.regex.Interface.Pattern

java.util.regex.Interface.Matcher

java.util.regex.Interface.MatchResult

java.util.regex.Interface.PatternSyntaxException

    Pattern对象就是编译好的正则表达式,可以应用到任意多个字符串,Matcher对象则对应单独的实例,表示将正则表达式应用到某个具体的目标字符串上。MatchResult封装了成功匹配的数据。匹配数据可以在下一次匹配尝试之前从Matcher本身获得,也可以提取出来作为MatchReslut保存。如果尝试匹配所使用的正则表达式格式不正确,就会抛出PatternSyntaxException异常,这是一个unchecked exception。操作细节可以参阅JDK的文档。

    更多学习正则表达式的资料如形式语言自动机理论、精通正则表达式等等书籍,当然,网上还有更多的资料。

开箱即用的Platform IO开发平台(包括Arduino,ESP8266,ESP32,STM32) 开箱即用的 Platform IO 离线开发环境,包含(ESP32,ESP32S2,ESP8266,Arduino,STM32) 阅读详情

相关推荐

WSL中使用VMD图形化界面

【代码】WSL中使用VMD图形化界面。

handsome213的博客 840

正则表达式-简介

摘取 https://goregex.cn/regex-intro.html 文章目录摘抄目的正则表达式是什么?正则表达式有什么用?起源及发展历史 摘抄目的 通过摘抄使自己明白了一个事物的发展过程。 知道了它的深刻含义,关键是自己懂得了要如何思考问题 说实话,不明白这些,我们也可以很好的运用正则表达式,那样自己永远不能像大师一样思考问题,会陷入到很细的东西里面 正则表达式是什么? 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算

一个专研技术的小蜜蜂的博客 234

现场总线课程设计-基于modbus协议使用QT实现主从站控制通信

【平台:QT】 【协议:modbus(注:由于要求,需要自己来实现modbus库,而非直接调用已有的库)】 【由于复制粘贴,时间原因可能格式有误,如需要具体工程文件以及报告文件请私信博主】 1、 大作业任务: (1)使用附件中工具软件体验MODBUS主从站数据传输过程(可在主从站模拟工具里面观察各功能码对应数据帧内容并对其进行分析) (2)使用串口调试助手,手工发出MODBUS主、从站该发出的数据,并观察对方发出的数据 (3)实现MODBUS主、从站功能,描述实现过程(语言不限于使用VC

weixin_44469597的博客 4066

mysql中使用正则表达式

MySQL采用Henry Spencer的正则表达式实施,其目标是符合POSIX 1003.2。请参见附录C:感谢。MySQL采用了扩展的版本,以支持在SQL语句中与REGEXP操作符一起使用的模式匹配操作。请参见3.3.4.7节,“模式匹配”。 在本附录中,归纳了在MySQL中可用于REGEXP操作的特殊字符和结构,并给出了一些示例。本附录未包含可在Henry Spencer的regex(7)...

tinysakura的博客 497

6G网络的关键技术、应用前景与挑战并存的科技征途

移动通信技术正以前所未有的速度迭代更新,而6G技术的研发进程渐渐成为了当前科技领域的热点。全球各国已纷纷将目光投向了充满想象的6G时代。本文将探讨全球6G技术研发的最新进展,以及6G技术的核心创新与潜在应用。

fiberroad的博客 2424

2025年从零开始:构建你的首个ComfyUI工作流-ComfyUI入门教程

然而,由于它拥有众多的插件节点,以及较为复杂的操作流程,学习起来相对困难。以前面搭建的文生图工作流为例,首先点击功能区的【保存】,然后你的浏览器会出来一个弹窗,你可以进行文件命名,点击确定后浏览器会下载该文件,也就是带“json”后缀的文件,这样我们的工作流就打包成一份文件了。思考一下前面说的,节点是不是需要下载安装才能使用,而我们复用别人的工作流,他用的节点你不一定下载了,因为目前有600多个节点,你不可能全部下载了吧,所以我们日后使用别人的工作流,你会经常出现这样的问题。

weixin_59486588的博客 1455

正则表达式在数据库中的应用

ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBSTR的功能相似4,REGEXP_REPLACE :与REPLACE的功能相似它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法相同,但是它们使用POSI...

sqiucheng的专栏 6518

【QGIS】【OsGeo4w】安装方法

every blog every motto: You will never know unless you try 0. 前言 因为目前要使用QGIS,然而环境配置就整了大半天,哎,进行简单记录,方便自己方便他人。 一共分为两种方式安装: 独立安装包 网络安装包(下载osgeo4w-setup) QGIS提供了不同的版本: 长期发行版(LTR) 最新版(LR) 开发人员版本(DEV,母版或测试版) 说明: 本文推荐第二种 1. 正文 1.1 下载osgeo4w 下载链接 下载完成: 1.2

胡侃有料的博客 2万+

正则表达式-入门篇

历史和起源 正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。 自此以后,正则表达式被广泛地应用到各种UNI...

weixin_30555753的博客 153

2025美赛E题为农业留出空间(附代码+全保姆教程)Making Room for Agriculture

有机农业的核心在于减少化学投入,促进自然控制和可持续性。变量定义CCC: 作物种群III: 害虫种群PPP: 天然捕食者种群(蝙蝠、鸟类等)BBB: 生物多样性水平(以种类数量表示)SSS: 土壤健康指数(影响植物繁殖与作物生长)EEE: 农业生态系统的整体稳定性。

博客 1495

深度解读 ABAP CDS View 中的 @Analytics.dataCategory: #FACT 注解

注解在 ABAP CDS View 中具有重要意义。它不仅定义了当前视图在数据模型中的角色,还为后续的分析和报告奠定了基础。在实际开发中,通过合理使用这一注解,可以显著提升数据模型的可用性和系统性能。无论是简单的 KPI 展示还是复杂的多维分析,这一注解都能发挥关键作用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 787

正则表达式

 正则表达式 http://baike.baidu.com/link?url=RLGUP-TeYOPjfRdiY7wsgaTeeUOuL_uPhqLhxzIR-RzSn3sy59IYFcVKBIt1tS3itfY8EUnB2WXEYAcVJMsX5a 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机

worldy的专栏 1370

点云从入门到精通技术详解100篇-点云的特征检测(续)

对每个维度的序列分别计算 DTW 距离,最后。权重将距离限制在较小的范围内,对于时间跨度大的数据集,过度限制了点对点的路径,同的,因此不能用欧氏距离来计算两个多元时间序列之间的距离,本文选用的是动态时。到的股票数据是未知分类的,因此该数据的相似性分析缺少有效的评价方式,通常需要。时间序列,简而言之,就是与时间相关的数据的集合,应用在生活工作中的方方面。时间序列的分段线性化表示的难点在于如何找出分段点,目前,对于分段点的研究。经过分段线性化之后,每个多元时间序列的维度是相同的,但是每一维的长度是不。

getusushu的博客 334

正则表达式(regex)及C语言实现,超强查找/匹配/替换算法

 DOS/Windows的文件名通配符,比如:*.txt,我们可能很熟悉。介绍一个更强的---正则表达式。 一、正则表达式正则表达式(regular expression,或简称regex ),是一种字符串查找的语言,一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。举几个例子吧:   正则表达式 "r.t",其中 . 表示任意一个字符(如同DOS的通配符 ?) ,可以在字

JoStudio 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

regex

regex

qq_33291307的博客 566

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Yacc 与 Lex 快速入门

Yacc 与 Lex 快速入门 Lex 与 Yacc 介绍 级别: 初级

燕青专栏 2117

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

GridBagLayout和GridBagConstraints

自己想做个小程序,却在布局上犯了难,使用FlowLayout和BorderLayout这些功能不够强大,使用GridBagLayout却不会,只好求助于文档了。文档对这个布局管理器介绍很详细,但是最痛苦的是英文。不过幸好它有实例,经过在网上查阅和推敲实例,终于对GridBagLayout的使用有了一个成型的了解,拿出来与大家分享。GridBagLayout是一个灵活的布局管理器,部件如果想

CLOCK 7093

windows下环境变量及其设置

记得刚接触java时总是为设置它的环境变量而烦恼,今儿有个机会搞明白了,写出来与大家分享。 环境变量相当于给系统或用户应用程序设置的一些参数, 具体起什么作用这当然和具体的环境变量相关. 比如path, 是告诉系统, 当要求系统运行一个程序而没有告诉它程序所在的完整路径时, 系统除了在当前目录下面寻找此程序外, 还应到path所记录的那些目录下去寻找。 设置环境变量分为两种,一种在

CLOCK 1639

java调用c++的东西(内有转载的内容)

项目需要,要从java里边调用c++写的一个模块,我本想用jni(java native interface)来着,用那个工程的dll文件,用native method 来加载。网上某位达人手把手教程序如下:package jni; public class CallDll {       static {              System.loadLibrary("

CLOCK 1395

Exception and Error

     Today I suddently be confused with the Exception and Error of Java. So I checked some infos about this. The Java Language Specification says that, The unchecked exceptions classes are the cla

CLOCK 789

Some basic knowledges about the class Object (1)

Some basic knowledges about the class Object (1) Lets talk about the java.lang.Object. Weve known that the class Object is the root of all java class. Just because of that, being familiar with

CLOCK 716

在网站改版中用正则表达式排查附件中的身份证号与手机号:误报、漏报与工程取舍

本文探讨在网站改版中利用正则表达式批量排查4200个附件中的身份证号与手机号。针对格式多样、人工核对耗时(约210小时)的难题,提出“先归一化后匹配”的工程策略,设计兼顾准确率与召回率的正则模式,并强调扫描件需OCR支持、Excel数字格式需文本化以避免漏检。通过构建“检测—定位—人工确认—处置留痕”闭环链路,实现从210小时到25分钟的效率跃升。文中警示误报漏报风险及落地四坑,明确适用边界:仅限固定格式敏感信息,不可替代业务判断。

bbsh2099的博客 421

正则表达式学习

给你一份实战向的正则入门,看完能读能写。

weixin_39766667的博客 138

Day30 · 正则表达式

正则表达式是匹配字符串规则的强大工具,通过 re 模块实现。掌握元字符、字符类、分组与量词,可高效完成邮箱、手机号等格式校验与提取。熟练使用 match、search、findall 等接口,结合编译优化性能,提升文本处理效率。

小嘉丶学长的博客 337

正则表达式学习笔记 02:基础语法

正则表达式是描述字符匹配规则的迷你语言,由普通字符和元字符组成。普通字符直接匹配自身,而元字符如.、*、+、^、$等具有特殊含义,用于控制匹配模式。常见功能包括任意字符匹配、字符类、预定义类(如\d)、量词、位置锚点、分组与捕获、环视断言及反向引用。需注意,若要匹配元字符本身,必须使用转义符\。例如,\.可匹配字面点号。

菜鸟的专栏 182
上一篇: Java安装后JDK/bin目录下的众多exe文件的用途
下一篇: 如何迅速成为Java高手
wzbclock
博客等级 码龄19年 69粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值