问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

正则匹配重复的行,求大神指教

发布网友 发布时间:2022-04-23 05:24

我来回答

2个回答

懂视网 时间:2022-04-23 09:45

这次给大家带来正则的重复匹配使用详解,正则重复匹配使用的注意事项有哪些,下面就是实战案例,一起来看一下。

本文实例讲述了正则表达式教程之重复匹配。分享给大家供大家参考,具体如下:

注:在所有例子中正则表达式匹配结果包含在源文本中的【和】之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明。所有java例子都在JDK1.6.0_13下测试通过。

一、有多少个匹配

前面几篇讲的都是匹配一个字符,但是一个字符或字符集合要匹配多次,应该怎么做呢?比如要匹配一个电子邮件地址,用之前说到的方法,可能有人会写出像w@w.w这样的正则表达式,但这个只能匹配到像a@b.c这样的地址,明显是不正确的,接下来就来看看如何匹配电子邮件地址。

首先要知道电子邮件地址的组成:以字母数字或下划线开头的一组字符,后面跟@符号,再后面是域名,即用户名@域名地址。不过这也跟具体的邮箱服务提供商有关,有的在用户名中也允许.字符。

1、匹配一个或多个字符

要想匹配同一个字符(或字符集合)的多次重复,只要简单地给这个字符(或字符集合)加上一个+字符作为后缀就可以了。+匹配一个或多个字符(至少一个)。如:a匹配a本身,a+将匹配一个或多个连续出现的a;[0-9]+匹配多个连续的数字。

注意:在给一个字符集合加上+后缀的时候,必须把+放在字符集合的外面,否则就不是重复匹配了。如[0-9+]这样就表示数字或+号了,虽然语法上正确,但不是我们想要的了。

文本:Hello, mhmyqn@qq.com or mhmyqn@126.com is my email.

正则表达式:w+@(w+.)+w+

结果:Hello, 【mhmyqn@qq.com】 or 【mhmyqn@126.com】 is my email.

分析:w+可以匹配一个或多个字符,而子表达式(w+.)+可匹配像xxxx.edu.这样的字符串,而最后不会是.字符结尾,所以后面还会有一个w+。像mhmyqn@xxxx.edu.cn这样的邮件地址也会匹配到。

2、匹配零个或多个字符

匹配零个或多个字符使用元符*,它的用法和+完全一样,只要把它放在一下字符或字符集合的后面,就可以匹配该字符(或字符集合)连续出现零次或多次。如正则表达式ab*c可以匹配ac、abc、abbbbbc等。

3、匹配零个或一个字符

匹配零个或一个字符使用元字符?。像上一篇说到的匹配一个空白行使用正则表达式 ,但在Unix和Linux中不需要 ,就可以使用元字符?, ? ? 这样既可匹配windows中的空白行,也可匹配Unix和Linux中的空白行。下面来看一个匹配http或https协议的URL的例子:

文本:The URL is http://www.mikan.com, to connect securely use https://www.mikan.cominstead.

正则表达式:https?://(w+.)+w+

结果:The URL is 【http://www.mikan.com】, to connect securely use 【https://www.mikan.com】 instead.

分析:这个模式以https?开头,表示?之前的一个字符可以有,也可以没有,所以它能匹配http或https,后面部分和前一个例子一样。

二、匹配的重复次数

正则表达式里的+、*和?解决了很多问题,但是:

1)+和*匹配的字符个数没有上限。我们无法为它们将匹配的字符个数设定一个最大值。

2)+、*和?至少匹配一个或零个字符。我们无法为它们将匹配的字符个数另行设定一个最小值。

3)如果只使用*和+,我们无法把它们将匹配的字符个数设定为一个精确的数字。

正则表达式里提供了一个用来设定重复次数的语法,重复次数要用{和}字符来给出,把数值写在它们中间。

1、为重复匹配次数设定一个精确值

如果想为重复匹配次数设定一个精确的值,把那个数字写在{和}之间即可。如{4}表示它前面的那个字符(或字符集合)必须在原始文本中连续重复出现4次才算是一个匹配,如果只出现了3次,也不算是一个匹配。

如前面几篇中说到的匹配页面中颜色的例子,就可以用重复次数来匹配:#[[:xdigit:]]{6}或#[0-9a-fA-F]{6},POSIX字符在java中是#\p{XDigit}{6}。

2、为重复匹配次数设定一个区间

{}语法还可以用来为重复匹配次数设定一个区间,也就是为重复匹配次数设定一个最小值和最大值。这种区间必须以{n, m}这样的形式给出,其中n>=m>=0。如检查日期格式是否正确(不检查日期的有效性)的正则表达式(如日期2012-08-12或2012-8-12):d{4}-d{1,2}-d{1,2}。

3、匹配至少重复多少次

{}语法的最后一种用法是给出一个最小的重复次数(但不必给出最大重复次数),如{3,}表示至少重复3次。注意:{3,}中一定要有逗号,而且逗号后不能有空格。否则会出错。

来看一个例子,使用正则表达式把所有金额大于$100的金额找出来:

文本:

$25.36

$125.36

$205.0

$2500.44

$44.30

正则表达式:$d{3,}.d{2}

结果:

$25.36

【$125.36】

【$205.0】

【$2500.44】

$44.30

+、*、?可以表示成重复次数:

+等价于{1,}

*等价于{0,}

?等价于{0,1}

三、防止过度匹配

?只能匹配零个或一个字符,{n}和{n,m}也有匹配重复次数的上限,但是像*、+、{n,}都没有上限值,这样有时会导致过度匹配的现象。

来看匹配一个html标签的例子

文本:

Yesterday is <b>history</b>,tomorrow is a <B>mystery</B>, but today is a <b>gift</b>.

正则表达式:<[Bb]>.*</[Bb]>

结果:

Yesterday is 【<b>history</b>,tomorrow is a <B>mystery</B>, but today is a <b>gift</b>】.

分析:<[Bb]>匹配<b>标签(不区分大小写),</[Bb]>匹配</b>标签(不区分大小写)。但结果却不是预期的那样有三个,第一个</b>标签之后,一直到最后一个</b>之间的东西全部匹配出来了。

为什么会这样呢?因为*和+都是贪婪型的元字符,它们在匹配时的行为模式是多多益善,它们会尽可能从一段文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到碰到第一个匹配时为止。

当不需要这种贪婪行为时,可以使用这些元字符的懒惰型版本。懒惰意思是匹配尽可能少的字符,与贪婪型相反。懒惰型元字符只需要给贪婪型元字符加上一个?后缀即可。下面是贪婪型元字符的对应懒惰型版本:

* *?

+ +?

{n,} {n,}?

所以上面的例子中,正则表达式只需要改成<[Bb]>.*?</[Bb]>即可,结果如下:

<b>history</b>

<B>mystery</B>

<b>gift</b>

四、总结

正则表达式的真下威力体现在重复次数匹配方面。这里介绍了+、*、?几种元字符的用法,如果要精确的确定匹配次数,使用{}。元字符分贪婪型和懒惰型两种,在需要防止过度匹配的场合下,请使用懒惰型元字符来构造正则表达式。在下一篇中将会介绍位置匹配。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

正则表达式教程的位置匹配教程(附代码)

用php与js实现正则匹配数字和字母组合的密码

热心网友 时间:2022-04-23 06:53

(^[^\n]+\n\n?)\1+

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
哪些网站可以找到更好的ppt配图? 有哪些“免费”的ppt模板,图片素材的网站? 推荐点梁汉文的好歌 梁汉文好听的经典歌 哲理词句大全精选278句 微信名字最好听527个 面试没过可以再争取话术 面试后被拒绝了如何重新争取 面试复试没通过还能争取吗 3d定制女仆2电脑配置这个配置能玩3D定制女仆2么不行的话需要换什么 怎么在桌面叫出小布? 如何召唤小布? 求一份抛光厂与工人的合同 一个刚成立的小工厂,请问需要哪些规章制度?文员、工人的合同范本? 五四青年节是个什么节日?年龄是多少岁之间?五四青年节的精神是什么? 烧酒越喝心如乱是哪首闽南歌 张清芳有首闽南歌,其中歌词有句是“烧酒一杯两杯三杯”,请问有谁知道是什么歌名? 有一首闽南歌 中有一句 林小酒 是那首歌啊 闽南歌歌词里有有一句明知自己没酒量的歌 歌词里面有酒酒酒淋淋不醉是什么歌??&#47;好像是个闽南歌 也不知道是粤语? 求《烧酒话》闽南语谐音 有一首闽南歌,歌词带“无醉啊我无醉”,歌名是什么? 一首关于酒的闽南歌 微信更换绑定手机号后,之前的那个手机号还可以重新申一个吗? 正则表达式 匹配重复 用手机注册的微信要换手机号想保留怎么办 如果换手机卡,原来的还可以用吗 手机号重新注册原还能用吗 手机号换了以前的还可以用吗 法学和法律有什么区别大学本科学的是 什么 请问这种图片和文字排版是用哪种软件做的 挖耳朵挖疼了张嘴也疼睡都不敢睡挖耳朵的那边然后去药 掏耳朵破了,后来张嘴都有点痛,是伤到神经了嘛 掏完耳洞后耳朵疼碰到一下也疼张嘴也疼会不会耳聋? 掏耳朵结痂后张嘴的时候耳朵疼是怎么回事 我前几天扣耳朵好像扣深了后来就一直疼张嘴也疼怎么办啊 耳朵掏了后一直痛,是怎么回事? 前两天掏了耳结,今天耳根子疼咋回事,吃饭都不敢张嘴,好疼 耳朵掏破了,现在整个耳朵疼,光耳道痛,耳廓也疼,反正哪也疼摸不得,用力张嘴咬东西扯的淋巴也疼 今天掏耳朵,好像弄重了然后现有点痛但过后就不痛了,但是碰到耳朵外面感觉有经扯到的痛,张嘴也会痛 前两天掏耳朵好像掏破了,耳朵里面痛 张嘴也会痛 而且耳垂下面有个硬硬的东西按上去不会痛 之前掏过耳朵 掏完之后左耳朵很痛 打哈欠痛吃东西也很痛碰一下都疼 前几天掏耳朵好像把表皮划伤了,这两天感觉疼痛,一张嘴就感觉耳朵疼。是左耳疼。问一下啊大夫会不会是划 电脑无法连接到电源是怎么回事 怎么搞?连接不上电脑也充不上电了 电脑显示屏为什么连不上电 这两个笔记本电脑连不上电源才启动机器一旦不能自动关机,电池有电吗? 电脑和显示屏都连不上电源 我的电脑主机为啥连不上电?电源没事呀! 笔记本电脑充电线也插上了,可充不了电,网络也连不上,这怎么回事