精通正则表达式

时间:2024-07-11 11:25:37编辑:花茶君

正则表达式(二)

或许对于上面这个例子,不用前后查找也能实现。比如用"文本匹配"、子表达式以及利用开始 ^ 、结束 $ 符都可以。但是很显然是比较耗时、繁琐的。比如下面这个例子: 对于上面的例子中,我们想要获取到标题标签里的 内容 , 注意:仅仅是要获取内容,而不获取标签本身。 或许我们可以这么写: .* 或许再完善一些,可以这么写: .* 我们会发现,这样虽然可以获取到标题标签和内容,但是我们不想要 —— 这些元素标签,我们只需要标签里的内容。虽然我们可以在进一步对返回的匹配结果进行处理,但是相对于前后查找显然是比较繁琐的。 基本语法: ?= 先来看几个例子 这里,我们在js中使用 match 方法去找出协议名称,可以很容易的匹配到。 对于这段正则 /.+(?=:) , 其中 ?= 正是向前查找的语法。对于使用 () 包裹起来的是字表达时,这个我们应该了解,也就是说,在子表达式中, 我们通过向前查找的语法 ?= 告诉正则, 我们只匹配 : 前面的内容。 如果我们不用向后查找 ?= 试一下: 正则: .+: 使用上面的正则运行一下你会发现,冒号 : 也被包含在匹配结果里了,显然,这不是我们想要的。 基本语法: ?<= 所谓的向后查找,就是查找某个字符位置的后面内容。 先来看几个例子 还是拿前面的向 前 查找的的匹配URL协议的例子。只不过我们现在把需求改一下,改成获取URL地址,但是 不包含协议头和冒号 。 修改后的正则: (?<=:).+ 。 这样,我们就会获取到协议后面的网址。也就是说会获取 : 后面的内容 (虽然带上了两个斜线 // ) 。 当然,这里我们可以直接调用JS中的location对象中的host(或者hostname)属性 ,包括协议名称也可以拿到,但是我们这里说的是正则😁。 理解了之后,我们开始着手解决刚开始我们遇到的场景:去找出标题标签中的内容。 在开始之前,我们要知道,前后查找可以同时用,也就是说 向后查找和向前查找可以同时用 。 而这里我们要查找出来标签里的文本内容,换句话说,就是要查找 和 之间的内容。 再进一步理解,就是我们要 对 进行向后查找,对 进行向前查找 。 文本: 正则: (?).*(?=) 。 这里我们通过两个子表达式来解决了前面的问题,两个子表达式就像两个定界符,分别在两边卡住了我们需要的内容。解决思路前面我们也已经解释了,就是前后查找同时用。 当然,这个正则有一些局限性,只能匹配 标签,我们可以进一步完善: 完善后的正则: (?).*(?=) 这里我们可以成功匹配 到 标签之间的内容,并且不论标签是否大小写,还有一点就是:利用了回溯引用, 前后标签不匹配的我们会忽略 。关于回溯引用,我的 另外一篇文章 中有写到。 这里的取非,和我们正则中的另外一个取非字符 ^ 不同,这里的取非,并没有使用 ^ 字符。 基本语法: ?! 我们来看一个例子 基本语法: ?<! 我们来看一个例子 文本: 我们需要做的是:找出价格,但是不包含 $ 符号。这里我们使用 向后查找 。 正则 : (?<=\$)\d+ 这样,我们会查找出价格,在这里就是 30 和 5 如果我们要查找出来数量,这里就要使用到 负向后查找 。 正则 : \b(?<!\$)\d+ 我们此时会返回 100 、 50 和 60 。 另外我们这里使用 \b 元字符来定义了单词边界,是为了防止出现查找到的内容包含一些非单词的内容。你可以尝试下去掉 \b 元字符再去匹配下,会发现返回的结果中包含了 $30 中的0,因为这个0完全符合规则,因为0前面不是$。 这里的前后查找又称 零宽断言 。 有四种基本的前后查找操作符: 所谓的前后查找,就是将我们充当定界符的东西放在 = 后面,这样就不会消费这个定界符,返回的结果只是这个界定符前面(或后面)的内容。 同时,我们可以将前后查找组合使用。

正则表达式入门经典的目录

第1章正则表达式概述1.1什么是正则表达式1.2可以使用正则表达式做什么1.3使用过的正则表达式1.4为什么正则表达式看起来令人生畏1.5支持正则表达式的语言1.6替换大量文本第2章正则表达式工具和使用方法2.1正则表达式工具2.2基于语言和平台的工具2.3使用正则表达式的分析方法第3章简单的正则表达式3.1匹配单个字符3.2匹配可选字符3.3其他限量操作符3.4大括号语法3.5练习第4章元字符和修饰符4.1正则表达式的元字符4.2空白和非空白元字符4.3修饰符4.4练习第5章字符类5.1字符类概述5.2在字符类中使用范围5.3字符类中元字符的含义5.4对字符类取反5.5POSIX字符类5.6练习第6章字符串.行和词边界6.1字符串.行和词边界6.2什么是词6.3识别词边界6.4练习第7章正则表达式中的圆括号7.1使用圆括号分组7.2交替选择7.3捕获圆括号7.4非捕获的圆括号7.5反向引用7.6练习第8章向前查找和向后查找8.1为什么需要向前查找和向后查找8.2向前查找8.3肯定式向前查找的例子8.4向后查找8.5如何匹配位置8.6练习第9章正则表达式的灵敏度和特殊性9.1什么是灵敏度和特殊性9.2灵敏度和特殊性的平衡9.3元字符如何影响灵敏度和特殊性9.4了解数据.灵敏度和特殊性9.5重新分析StarTrainingCompany的例子9.6练习第10章说明和调试正则表达式10.1说明正则表达式10.2了解你的数据10.3创建测试用例10.4调试正则表达式第11章在MicrosoftWord中使用正则表达式11.1用户界面11.2可用的元字符11.3例子11.4搜索和替换的例子11.5VBA中的正则表达式11.6练习第12章在StarOffice/OpenOffice.orgWriter中使用正则表达式..12.1用户界面12.2可用的元字符12.3搜索的例子12.4搜索和替换的例子12.5POSIX字符类12.6练习第13章通过findstr使用正则表达式13.1findstr简介13.2findstr支持的元字符13.3词边界位置13.4行开始位置和结束位置13.5单个文件的例子13.6多个文件的例子13.7文件列表的例子13.8练习第14章PowerGREP14.1PowerGREP的界面14.2PowerGREP支持的元字符14.3复杂一点的例子14.4练习第15章MicrosoftExcel中的通配符15.1Excel的查找界面15.2Excel支持的通配符15.3在记录单中使用通配符15.4在筛选中使用通配符15.5练习第16章SQLServer2000中的正则表达式功能16.1支持的元字符16.2在LIKE中使用正则表达式16.3对字符类取反16.4使用全文搜索16.5图像字段中的筛选器16.6练习第17章在MySQL中使用正则表达式17.1MySQL简介17.2MySQL支持的元字符17.3使用REGEXP关键字和元字符17.4社会保险号的例子17.5练习第18章正则表达式与MicrosoftAccess18.1MicrosoftAccess中元字符的用法18.2Access支持的元字符18.3使用#元字符18.4使用#字符匹配日期/时间数据18.5在Access中使用字符类18.6练习第19章JScdpt和JavaScript中的正则表达式19.1在JavaScript和JScript中使用正则表达式19.2JavaScript和JScnPt中的元字符19.3说明JavaScript正则表达式19.4验证SSN的例子19.5练习第20章正则表达式与VBS20.1RegExp对象及其用法20.2使用Match对象和Matches集合20.3VBScript支持的元字20.4练习第21章VisualBasic. NET与正则表达式21.1System.Text.RegularExpressions命名空间21.2VisualBasic. NET支持的元字符21.3练习第22章C#和正则表达式22.1System.Text.RegularExpressions命名空间中的类22.2VisualC#.NET支持的元字符22.3练习第23章PHP和正则表达式23.1PHP5.0入门23.2PHP组件如何支持正则表达式23.3PHP支持的元字符23.4练习第24章W3CXMLSchema中的正则表达式24.1W3CXMLSchema基础24.2练习第25章Java中的正则表达式25.1java.util.regex包简介25.2java.util.regex包中支持的元字符25.3使用String类的方法25.4练习第26章Peri中的正则表达式26.1下载并安装Perl26.2使用Perl正则表达式的基本条件26.3使用Perl正则表达式26.4Perl支持的元字符26.5在Perl中使用正则表达式匹配模式26.6一个简单的PerlRegex测试程序26.7练习附录练习答案……

正则 匹配大括号内的逗号

这个确实比较困难啊。
主要难度在你的大括号的嵌套。
如果你的大括号的嵌套是成对出现的,我倒是有个思路,如果可行,你倒是可以试一下:
1、正则语句:\{[^\{\}]+\}
这句话可以取到最内层的“{...}”,如果没有嵌套就直接取出来了,
比如:广州{南海,顺德,三水},佛山{南海,顺德,三水,{shanghai,{aaaaa,aaaaa}}},
取出了:{南海,顺德,三水}和{aaaaa,aaaaa}
这是可以对取出的这2个替换逗号,然后将大括号替代成其他字符,比如“#”和“$”,然后再次使用正则匹配,这个就是递归了。
2、与上面的类似,不是反其道
正则语句:\}[^\{\}]+{
这句话可以找到“}”“{”之间的不包含“{”“}”的全部数据,也就是说一次性找出大括号外的数据,这种方法不能找出第一个{之前的数据和最后一个}之后的数据,这个很捡到,检索一次就好。将这些数据的逗号替换成其他字符,如“#”,然后将其他的逗号替换成你想要的字符,最后将“#”替换回逗号,结束。
个人感觉两种方法都可行,第二种方法比较简单,不需要递归,仅供参考。


为什么大家都不喜欢用正则表达式?

正则表达式,又称规则表达式,是计算机科学的一个概念,这个概念最初是由Unix中的工具软件普及开的。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。正则引擎主要分为DFA、NFA两大类。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究。通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。大多数人不喜欢它,他们不理解它,不使用它,不写规则化,很难写出准确,有效的规则化。不需要更多,也不需要更好的解决方案。出于对“规则”这个词的恐惧,许多人第一次听到这个名字是一件很奇怪的事情。它似乎是一个乱七八糟的字符串,看起来头晕,而且没有学习的欲望。很多的规则不仅看起来很奇怪,而且还有两个常规引擎DFA,NFA,还有更多的类型,例如PCRE、位置/gnu BRE、位置/gnu ERE,特别是操作的同事,发现可以在grep下正常匹配时,awk无法正常匹配。DFA引擎的mysql、Java、flex、awkNFA引擎的perl、Java、grep、更多、vi、PHP(在旧版本的PHP中,有三个类库),DFA NFA引擎混合在TCL语言中。大部分的工作不被使用,很少被使用,因此也懒得去学习。这两个函数主要解决以下问题:冗长的表达式结构。当匹配一种复杂的格式时,所使用的表达式不仅单调乏味,而且还晦涩难懂,它可以在不小心更改符号的情况下进行更改。无限级多重替代功能将极大地改善这种情况。可以将替换工作分解成几个步骤,这些步骤可以单独处理,使思路清晰,表达式易于维护。不可能完成的任务。正则表达式是通用的,有很多格式是不可能的或者很难使用表达式来完成的,很多时候我们需要编写一个新的程序来解决,引用函数时,很多问题都被解决了。参考其替代的结果,这是非常有用的在处理复杂的格式。

使用正则表达式的优缺点 C#

书,当然首选《精通正则表达式》
第三版,现在网上也有电子书,你可以看看
我觉得最大的缺点有以下几个方面:
1.正则表达式只适合匹配文本字面,不适合匹配文本意义:像匹配url,email这种纯文本的字符就很好,但比如匹配多少范围到多少范围的数字,如果你这个范围很复杂的话用正则就很麻烦。或者匹配html,这个是很多人经常遇到的,写一个复杂匹配html的正则很麻烦,不如使用针对特定意义的处理器来处理(比如写语法分析器,dom分析器等)
2.容易引起性能问题:像.*这种贪婪匹配符号很容易造成大量的回溯,性能有时候会有上百万倍的下降,编写好的正则表达式要对正则引擎执行方式有很清楚的理解才可以
3.正则的替换功能较差:甚至没有基本的截取字符串或者把首字母改变大小写的功能,这对于url重写引擎有时候是致命的影响
但是也有优点:只要熟练应用正则表达式,而且匹配的目标是纯文本,那么相比于写分析器来说,正则可以更快速的完成工作。还有在捕获字符串的能力,正则也可以很好的完成工作,比如截取url的域名或者其他的内容等等


上一篇:正压气力输送

下一篇:thl糖葫芦手机官网