正则表达式笔记之三

第六:Charles抓包-苹果手机抓包 【代码】第六:Charles抓包-苹果手机抓包。 阅读详情

 复杂模式不仅仅由字符类和量词组成,也可以由分组、反向引用、前瞻和其他一些强大的正则表达式功能组成。下面将介绍这些概念。

 

1, 分组:在之一和之二里的正则表达式都是处理一个字符接一个字符正如所预期的,特定的字符序列(不仅包含单独的字符)可以重复它们自身。要处理字符序列,正则表达式支持分组功能。

       分组是通过用一系列括号包围一系列字符、字符类以及量词来使用的。例如,要匹配字符串"dogdog"。使用前面的方法,可能的表达式应该类似:

       var regPattern = /dogdog/;

       尽管这是可以的,但是不简洁。如果不知道dog在字符串中到底出现几次时怎么办?这里,我们可以使用分组来重写此表达式:

       var regPattern = /(dog){2}/;

       表达式中的括号的意思是字符序列"dog"将在一行上连续出现两次。但是并不限制在分组后使用花括号,可以使用任意量词:

       var reg1 = /(dog)?/;            // match 0 or 1 occurrences of "dog"

       var reg2 = /(dog)*/;            // match 0 or more occurrencess of "dog"

       var reg3 = /(dog)+/;            // match 1 or more occurrencess of "dog"

       通过混合使用字符、字符类和量词,可以实现一些相当复杂的分组:

       var reg = /([bd]ad?)*/;        // match zero or more occurrencess of "ba","bad", "da", "dad"

       同时也可以将分组放在分组中间:

       var reg = /(mom( and dad)?)/;          // match "mom" or "mom and dad"

       这个表达式要求"mom"是必需的,但是字符串" and dad"可以出现零次或一次。

      

       利用这个特性,我们可以为JavaScript的string类加上trim功能:

       String.prototype.trim = function()

       {

             var regExtraSpace = /^/s+(.*?)/s+$/;

             return this.replace(regExtraSpace, "$1");

       }

        这个正则表达式将查找字符串开头的零个或多个空白,跟着是任意数目的字符(在分组中捕获的字符),最后在字符串结尾处又是零个或多个空白。通过配合使用string对象的replace()方法以及反向引用,就实现了该trim方法

 

2, 反向引用:每个分组都被存放在一个特殊的地方以备将来使用。这些存储在分组中的特殊值,我们称之为反向引用。反向引用是按照从左到右遇到的左括号字符的顺序进行创建和编号的。例如:表达式(A?(B?(C?)))将产生编号1~3的三个反向引用:

       (1)  (A?(B?(C?)));    (2)  (B?(C?));   (3)  (C?)。

      反向引用有几种不同的使用方法:

      a, 首先,使用正则表达式对象的test(), match()或search()方法后,反向引用的值可以从RegExp构造函数中获得, 例如:

          var sToMatch = "#123456789";

          var regNumber = /#(/d+)/;

          regNumber.test(sToMatch);

          alert(RegExp.$1)                    // output "123456789"

          这个例子尝试匹配后面跟着几个或多个数字的磅符合。并对数字进行分组以存储他们。在调用test方法后,所有的反向引用都被保存在RegExp构造函数中,从RegExp.$1(它保存乐第一个反向引用)开始,如果还有第二个反向引用,就是RegExp.$2。因为该组匹配了"123456789",所以RegExp.$1中就存储了这个字符串。

      b, 然后,海可以直接在定义分组的表达式中包含反向引用。这可以通过使用特殊转义序列如/1,/2等实现。如:

          var sToMatch = "dogdog";

          var regDogDog = /(dog)/1/;

          alert(regDogDog.test(sToMatch));           // output "true"

          正则表达式regDogDog首先创建单词dog的组,然后又被特殊转义序列/1引用,使得这个正则表达式等同于/dogdog/。

      c, 第三,反向引用可以用在string对象的replace()方法中,这通过使用特殊字符序列$1, $2等来实现。描述这种功能的最佳例子是调换字符串中的两个单词的顺序。如:

          var sToMatch = "1234 5678";

          var regMatch = /(/d{4}))(/d{4})/;

          var sNew = sToMatch(.replace(regMatch, "$2 $1");

          alert(sNew);                 // output "5678 1234"

          在这个例子中,正则表达式有两个分组,每个分组有四个数字。在replace()方法的第二个参数中,$2等同于"5678", $1等同于"1234",对应于它们在表达式中出现的顺序。

 

3, 候选:候选操作符和ECMAScript的二进制异或一样,是一个管道符(|),它放在两个单独的模式之间。例如,如果要对同一个表达式同时匹配"red"和"black"时要怎么做呢?它们完全没有相同的字符。这时,用候选就可以实现。

       var sToMatch1 = "red";

       var sToMatch2 = "black";

       var regRedBlack = /(red|black)/;

       alert(regRedBlack.test(sToMatch1));        // outputs "true";

       alert(regRedBlack.test(sToMatch2));        // outputs "true";

       在这里,regRedBlack匹配"red"或"black",同时测试每个字符串都返回"true"。因为两个备选项存放在一个分组种的,不管哪个被匹配乐,都会存在RegExp.$1中以备将来使用(同时也可以在表达式中使用/1)。在第一个测试中,RegExp.$1等于"red",在第二个中,它等于"black"。也可以指定任何数目候选项,只要你能想到的,只要在之间加入候选操作符即可。

       OR模式在实践中一种通常的用法时从用户输入中删除不合适的单词,这对于在线论坛来说是非常重要的。通过针对这些敏感单词使用OR模式和replace()方法,则可以很方便地在帖子发布之前去掉敏感内容:

        var regBadWords = /badWord|anotherBadWord/gi;

        var sUserInput = "this is a string using badword1 and badword2";

        var sFinalText = sUserInput.replace(regBadWords, "****");

        alert(sFinalText);     // outputs "this is a string using ****1 and ****2"

       这个例子中指定"badwords“是不合适的。表达式使用OR操作符来指定这个单词。当使用replace()方法后,所有非法单词都被替换成四个星号。

       也可以用星号替换敏感词中的每一个字母,也就是说最后出现的文本中星号的数量和敏感词中的字符数量是一样的。使用函数来作为replace()的第二个参数,就可以达到这个目的:

        var regBadWords = /badWord|anotherBadWord/gi;

        var sUserInput = "this is a string using badword and anotherbadword";

        var sFinalText = sUserInput.replace(regBadWords, function(sMatch) {

              return sMatch.replace(/./g, "*");

        }

        alert(sFinalText);     // outputs "this is a string using ******* and **************"

       在这段代码中,作为第二个参数传给replace()的函数其实还使用乐另外一个正则表达式。当执行函数之后,sMatch包含乐敏感词汇中的一个。最方便快捷的将每个字符替换成星号的方法是对sMatch使用replace()方法,指定一个匹配任意字符的模式并将其替换成一个星号。

 

4, 非捕获性分组:创建反向引用的分组,我们称之位捕获性分组。同时还有一种非捕获性分组,它不会创建反向引用。在较长的正则表达式中,存储反向引用会降低匹配速度。通过使用非捕获性分组,仍然可以拥有与匹配字符串序列同样的能力,而无需存储结果的开销。

       如果要创建一个非捕获性分组,只要在左括号的后面加上一个问号和一个紧跟的冒号:

       var sToMatch = "#123456789";

       var regNumber = /#(?:/d+)/;

       regNumber.test(sToMatch);

       alert(RegExp.$1);                    // output ""

       这个例子的最后一行代码输出一个空字串,因为该分组是非捕获性的。正因如此,replace()方法就不能通过RegExp.$1变量来使用任何反向引用,或在正则表达式中使用它。

       正则表达式又一个十分常用的方式是去掉文本中所有的HTML标签,尤其是在论坛和BBS上,这可以防止游客在他们的发帖中插入恶意或无意的HTML。删除HTML标记的正则表达式很简单,只要用一个简单的表达式:

       var regTag = /<(?:.|/s)*?>/g;

       这个表达式匹配一个小于号(<)后面跟着任何文本(这是在一个非捕获性分组内指定的),然后跟着一个大于号(>),这有效地匹配乐所有的HTML标签。这里使用非捕获性分组是因为在小于号和大于号之间出现的内容并不重要(这些都是要被删除的)。你可以使用这个模式给string对象创建自己的stripeHTML()方法:

       string.prototype.stripeHTML = function() {

             var regTag = /<(?:.|/s)*?>/g;

             return this.replace(regTag, "");

       };

       使用这个方法也很简单:

        var sTest = "<b>this would be bold</b>";

        alert(sTest.stripeHTML());             // output "this would be bold"

 

5, 前瞻: 有时,可能希望,当某个特定的字符分组出现在另一个字符串之前时,才去捕获它。如果使用前瞻就可以让这个过程变得十分简单。

       前瞻告诉正则表达式运算器向前看一些字符而不移动其位置。同样存在正向前瞻和负向前瞻。正向前瞻检查的是接下来出现的是不是某个特定字符集。而负向前瞻则是检查接下来的不应该出现的特定字符集。

       创建正向前瞻要将模式放在(?=和)之间。注意这不是分组,虽然它也用到括号。事实上,分组不会考虑前瞻的存在。考虑下列代码:

       var sToMatch1 = "bedroom";

       var sToMatch2 = "bedding";

       var regBed = /(bed(?=room))/;

       alert(regBed.test(sToMatch1));          // output "true";

       alert(RegExp.$1);                                // output "bed";

       alert(regBed.test(sToMatch2));          // output "false"

       在这个例子中,regBed只匹配后面跟着"room"的"bed"。因此,它能匹配sToMatch1而不能匹配sToMatch2。在用表达式测试sToMatch1后,这段代码输出RegExp.$1的内容是"bed",而不是"bedroom"。模式的"room"的部分是包含在前瞻中的,所以没有作为分组的一部分返回。

       对于负向前瞻,要创建它,则要将模式放在(?!和)之间。前面的例子也可以改成用负向前瞻匹配"bedding"而不是"bedroom"。

       var sToMatch1 = "bedroom";

       var sToMatch2 = "bedding";

       var regBed = /(bed(?!room))/;

       alert(regBed.test(sToMatch1));          // output "false";

       alert(regBed.test(sToMatch2));          // output "true";

       alert(RegExp.$1)                                // output "bed"

        这里,表达式变成只匹配后面不跟"room"的"bed",所以模式匹配"bedding"而不是"bedroom"。在测试sToMatch2后,RegExp.$1还是包含"bed",而不是"bedding"。

 

 4, 边界: 边界用于正则表达式中表示模式的位置。下表列出乐几种可能的边界:

        边界                           描述

         ^                             行开头

         $                             行结尾

         /b                            单词的边界

         /B                            非单词的边界

        假设想查找一个个单词,但要它只出现在行尾,则可以使用符号($)来表示:

        var sToMatch = "Important word is the last one."

        var regLastWord = /(/w+)/.$/;

        regLastWord.test(sToMatch);

        alert(regLastWord.$1);                  // output "one"

        例子中的正则表达式查找的是,在一行结束之前出现的跟着句号的一个或多个单词字符。当用这个表达式测试时,结果是"one"。还可以很容易地获取一行的第一个单词,如:

        var sToMatch = "Important word is the last one.";

        var regFirstWord = /^(/w+)/;

        regFirstWord.test(sToMatch);

        alert(regFirstWord.$1);                 // output "Important"

        在此例子中,表达式查找行起始位置的一个或多个单词字符。如果遇到非单词字符,匹配停止,输出"Important"。这个例子也可以用单词边界实现:

        var sToMatch = "Important word is the last one.";

        var regFirstWord = /^(.+?)/b/;

        regFirstWord.test(sToMatch);

        alert(regFirstWord.$1);                // output "Important";

        这里,表达式用惰性量词来制度在单词边界之前可以出现的任意字符,且可出现一次或多次(如果使用贪婪量词,表达式就匹配整个字符串)。

        使用单词边界可以方便地从字符串中抽取单词:

        var sToMatch = "First second third fourth fifth sixth";

        var regWord = //b(/S+)?/b/g;

        var arrWords = sToMatch.match(regWord);

        正则表达式regWord使用单词边界(/b)和非空白字符类(/S)从句子中抽取单词。注意行的开头和行的结束,通常由^和$表示的位置,对应地也认为是单词的边界。事实上,更加简单的方法是使用单词字符类(/w):

        var sToMatch =  "First second third fourth fifth sixth";

        var regWord = /(/w+)/g;

        var arrWords = sToMatch.match(regWord);

 

5, 多行模式:如果字符串包含多行的情况下,可以使用多行模式来获取值。要指定多行模式,只要在正则表达式后面添加一个m选项。这会让$边界匹配换行符(/n)以及字符串真正的结尾。

        var sToMatch =  "First second/nthird fourth/nfifth sixth";

        var regWord = /(/w+)$/gm;

        var arrWords = sToMatch.match(regWord);

       多行模式同样也会改变^边界的行为,这时它会匹配换行符之后的位置。例如,前面的例子,要从字符串中获取"First", "third"和"fifth",则可以这么做:

        var sToMatch = "First second/nthird fourth/nfifth sixth";

        var regWord = /^(/w+)/gm;

       若不指定多行模式,将只返回"First".

 

Far planner代码系列(2) graph_decoder系列(2) 承接上文 我们接着来看decoder_node.cpp的代码部分 void GraphDecoder::Init() { /* initialize subscriber and publisher */ //graph_sub_ 订阅节点/robot_vgraph 其类型是visibility_graph_msg/Graph的消息 graph_sub_ = nh.subscribe("/robot_vgrap... 阅读详情

相关推荐

保姆级教程:用Labelme标注车辆关键点,并一键转成YOLOv8-pose训练格式

本文提供了一份详细的车辆底盘关键点标注教程,从使用Labelme进行标注到一键转换为YOLOv8-pose训练格式的全流程指南。特别针对工业检测和自动驾驶场景,分享了标注规范、格式转换脚本及常见问题解决方案,帮助开发者高效准备训练数据并优化模型性能。

weixin_27419879的博客 309

常用正则表达式<转>

"^\d+$"  //非负整数(正整数 + 0)"^[0-9]*[1-9][0-9]*$"  //正整数"^((-\d+)|(0+))$"  //非正整数(负整数 + 0)"^-[0-9]*[1-9][0-9]*$"  //负整数"^-?\d+$"    //整数"^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0)"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0

morning2008的专栏 2256

Win11下Python脚本不执行?5分钟搞定PATH环境变量配置(VSCode终端实测)

本文针对Win11系统下VSCode终端中Python脚本执行无响应的问题,提供了详细的诊断与解决方案。核心在于正确配置PATH环境变量,通过图形化界面调整Python路径优先级,并分享了VSCode终端环境变量的刷新技巧,帮助开发者在5分钟内快速解决环境配置难题。

weixin_28358083的博客 384

js正则匹配小于某个数字,小于32的正则表达式

匹配小于32数字的正则表达式 let regex = /[0-9]|[0-2][0-9]|3[0-2]/ // 匹配小于32的数字 regex.test('3') // true regex.test('33') // false 所以小于64数字的正则表达式是 let regex = /[0-9]|[0-5][0-9]|6[0-4]/ regex.test('23') // tru...

weixin_39703282的博客 1万+

【UV打印机】RYPC打印软件教程(二)-软件界面概述

下图是控制软件的主操作界面.将喷绘机的操作规纳为四块,分别为参数设置,任务选择,打印控制,系统维护,对于日常打印而言,只需操作任务选择,打印控制。从而使汲及的操作相对较少,使得系统对普通用户而言简单易用.

Print World的专栏 3601

QcarCamera-EVS HAL实现(一)

高通车载EVS实现

qq_37057338的博客 2377

大于0小于等于1的正则表达式

开发中遇到了“大于0小于等于1且小数点后不超过8位的正则表达式(排除0.0,0.00等,允许0.100等)”的需求,一开始只找到了以下正则表达式,0+$) 这一段,目前只知道?是正则中的正向否定预言,具体实现原理还不清楚。但该正则表达式无法排除0.0,0.00等情况,到处搜寻后发现了以下正则表达式,

weixin_51982773的博客 2790

手把手教你学Simulink--基于未来出行解决方案的场景实例:电动飞行汽车(eVTOL)的动力系统建模与仿真

电动垂直起降飞行器零道路拥堵:三维空间飞行绿色低碳:全电驱动,零排放快速响应:城市内15分钟直达低噪音:相比直升机↓20dB📊 预测:2030年全球eVTOL市场规模将超300亿美元,中国、美国、欧洲加速适航认证。本文通过,构建了电动飞行汽车(eVTOL)动力系统高压电池系统建模电力电子(DC-DC、逆变器)实现PMSM电机+螺旋桨推进系统搭建完整飞行任务动态仿真性能KPI评估与优化。

MHD0815的博客 443

正则表达式

<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> <br />正则表达式:<br />正则表达式定义了由一个或多个字符串组成的集合。简单字符串也是正则表达式,它定义了由该字符串自身组成的集合。复杂的正则表达式使用字母、数字、和特殊字符来定义不同的字符串。正则表达式匹配它定义的任何字符串。<br />字符:<br /> 字符除换行符以外的其他任意字符。大多数字符代表他们自身,而

蚊室 684

PCL ——LevenbergMarquardt非线性最小二乘法拟合圆柱(C++详细过程版)

使用C++详细过程版实现的LevenbergMarquardt非线性最小二乘法拟合圆柱

点云侠的博客 607

ElectrolyteGPT:首个电池电解液逆向设计的生成式 AI 系统 —— 算法原理与复现解析

数据驱动的重要性:1100 万→100 万的精心筛选,比单纯增大模型更有效领域适配:fLine 表示法、正则分词、化学感知的数据增强(SMILES randomization)都是关键小模型的力量:6M 参数在特定化学空间的表现,远超通用大模型在相同任务上的零样本能力条件生成的极限:10 维条件导致模型崩溃,提示我们需要更好的条件编码策略(如 diffusion guidance、RLHF-style 偏好优化)未来方向配方实验验证。

ASKCOS博客 123

JS正则表达式详解

一、什么是正则表达式? 1.定义:      正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符

u013084331的博客 2465

如何用Python打造PubMed API客户端:科研文献检索自动化实践

PubMed提供了官方的Entrez E-utilities API接口,支持程序化检索文献,但直接调用API需处理请求重试、参数封装、数据解析等问题。批量获取文献ID及结构化详情(标题、作者、DOI等)内置重试机制,应对网络波动或API限流统一数据输出格式,便于后续分析(如文献计量、AI文本处理)灵活适配不同检索需求(如指定数据库、结果数量)本文实现的PubMed API客户端,通过封装API请求、重试机制、数据解析,让科研文献检索从“手动点击”变为“代码自动化”。

ASKCOS博客 358

正则表达式笔记

转载:韩顺平正则表达式笔记

cfy的博客 254

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

读《精通正则表达式》之思维导图笔记——第一弹

读《精通正则表达式》之思维导图笔记——第一弹**第一章知识点总结:**

TryingBestFly的博客 754

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

正则表达式学习笔记

正则表达式学习笔记

weixin_42750888的博客 111

VC中sqlite的使用

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

正则表达式简略笔记

说明:之前提到正则表达式就头大,每次也都是看个开头就不看了,坚持不下去,这次终于完整地看完一次文档,加上之前多多少少看过的,对正则表达式算是有了整体的了解。这次笔记主要结合一培训班的课件,以Python的re模块为主。 简略笔记: 1,正则表达式(Regular Expression),正则表达式使⽤单个字符串来描述、匹配⼀系列匹配某个句法规则的字符串。简单说就是,这是一个规则,它体现为一个字...

404 Not Found 2673

正则表达式使用笔记

本文介绍了正则表达式的基础元字符及其用法,包括通配符.、字符集[]、重复元字符{}/*/+/?、定位符^/$以及转义符\等。通过Python代码示例演示了各种元字符的实际应用场景,如匹配特定模式的字符串、控制匹配字符数量范围等。文章还解释了贪婪匹配与懒惰匹配的区别,并提供了在线测试工具链接,方便读者实践练习。

2301_80468619的博客 1267

正则表达式课程笔记

正则表达式课程笔记 正则表达式是什么? 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 正则表达式语法 普通字符 字母,数字,汉字,下划线,以及没有特殊定义的标点符号,都是“普通字符”,表达式中的的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。 a 匹配a 普匹配普 转义字符 \t匹配制表...

weixin_44881107的博客 220

正则表达式基础个人学习笔记

正则表达式,常常缩写为 “regex” 或 “regexp”,是帮助程序员匹配、搜索和替换文本的模式。正则表达式非常强大,但可能难以阅读,因为它们使用特殊字符来做更复杂更灵活的匹配。

Sentra233的博客 2236

基本正则表达式笔记

正则表达式 用一些特定的字符串来匹配目标字符串里面的内容 笔记 import re # 单个字符的匹配 # [] \d \w \s # . 匹配单个字符:['Good', 'food'] print(re.findall(".ood","I say Good and food")) # [] 括号里面 的内容会被逐一的单个匹配 ['Good', 'food'] print(re.findall("[Gf]ood","I say Good and food")) # \d 匹配单个数字 ['4', '0']

Zeker62的博客 124

个人笔记:正则表达式+ECMAScript 6

这是本人在学习ES6和正则表达式时做的一些笔记,ES6在前半部分,正则表达式在后半部分

weixin_45235422的博客 175

正则表达式个人笔记

1.正则表达式是什么 正则表达式是用来进行文本匹配的工具,是一种专门用于处理字符串的语言 2.元字符 代码 说明 . 匹配除换行符外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符(包括空格、tab、换行等) \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 3.限定符 代码 说明 * 重复0次或多次 + 重复1次或多次 ? 重复0次或1次 {n} 重复n次 {n,} 重复

yfl15872373643的博客 188
上一篇: 正则表达式笔记之二
下一篇: Html中Document和Event里各种坐标的定义
unicode
博客等级 码龄25年 33粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值