正则表达式量词匹配方式的讲解上篇

3次阅读

共计 2625 个字符,预计需要花费 7 分钟才能阅读完成。

如果想要零碎的学习正则表达式的话,那么对于量词的匹配形式是必须要把握好的内容。量词的匹配形式有三种,别离是 匹配优先 疏忽优先 以及 占有优先。明天这篇文章先来解说一下匹配优先和疏忽优先,什么,你感觉很难?置信我,读完这篇文章你必定能够把握的很好。不置信?那就让我来带着你试一试吧。

在持续上面的文章之前,咱们先来做个小练习题。那就是应用量词匹配一个简略的字符串,咱们当初假如这个字符串是"hello world",如下图所示:

有点正则表达式根底的同学很快就能够写出".*",很好,完满地匹配了咱们的测试字符串。

那如果我将测试用例变为 "hello" "world",咱们会发现下面的正则表达式还是能够匹配整个测试用例,然而却不是咱们想要的后果。咱们心愿的是可能别离匹配"hello""world"而不是这个整体。

那这个时候咱们须要如何批改下面的正则表达式,才能够达到咱们想要的目标呢?其实很简略,只须要在 * 前面增加一个 ? 就能够了。是不是很神奇呢?

好,是时候展现真正的技术了。哦不,是时候跟大家解释一下什么是匹配优先,什么是疏忽优先了。

匹配形式的介绍:

首先咱们须要晓得量词都有哪些?根本的量词有 ?(能够匹配 1 次或者 0 次),*(能够匹配无数次或者 0 次),+(至多须要匹配 1 次)。还有由大括号括起来的量词,比方{2}(匹配 2 次), {2, 6}(匹配 2 到 6 次), {2,}(匹配至多 2 次)。
量词默认是匹配优先的,如果在下面量词(须要是可能示意范畴的量词)的前面再增加一个?,那么下面的量词就变成了疏忽优先的量词,比方??*?+?

匹配优先:

匹配优先又叫做 贪心匹配 ,它的特点是, 在量词作用下的表达式会尽可能尝试匹配满足条件的字符,直到前面的字符串不满足这个表达式或者达到字符串的结尾 。只有在正则表达式整体在尝试匹配却没有匹配胜利的状况下,匹配优先的这部分才会 偿还曾经匹配的局部字符,好让整体可能匹配胜利。

对于 ".*" 来说,它的匹配过程如下图所示:

  • 第一步:正则表达式的 " 开始匹配测试用例的第一个字符,发现测试用例的第一个字符也是 ",于是正则表达式中的" 局部匹配胜利。而后开始持续上面的匹配。
  • 第二步:正则表达式的 .* 是一个整体,示意 . 能够匹配无数次,或者 0 次。.是一个元字符能够匹配任何字符(除了行的结束符),所以在遇到行结束符之前,这部分表达式对于接下来的字符都是能够匹配胜利的,就像上图示意的那样,始终匹配到这一行的完结。
  • 第三步:正则表达式的第三局部 " 须要在测试用例中可能匹配到 ",然而因为.* 曾经匹配到测试用例这一行的结尾了,所以为了正则表达式的整体可能匹配胜利,.*须要偿还曾经匹配到的字符 。在这个例子中,须要把最初匹配的" 字符让进去。让正则前面的 " 这部分尝试匹配,而后发现 " 能够匹配让进去的 " 字符,至此,整个匹配过程实现。

咱们发现,.*在匹配的过程中让出了一部分曾经匹配的字符;这个过程咱们称之为 回溯,这个会在当前的文章中跟大家具体的解说一下。

对于匹配优先咱们其实能够拿生存中的一些场景作类比。好比夏天到了,你比拟喜爱喝啤酒,而后你会把你的冰箱外面塞满啤酒,尽管你很想再塞进去一些,然而冰箱的容积就那么大(类比匹配到了字符串的结尾),所以你没方法再放更多的啤酒进去。这时候你想到只喝啤酒还不够过瘾,你还想吃点肉。所以你买了卤鸡腿,而后把冰箱中的一些啤酒拿了进去(类比正则中的回溯,偿还曾经匹配的字符),省出的空间用来放鸡腿,而后这样你感觉比拟完满了(类比正则表达式匹配胜利)。

疏忽优先:

疏忽优先又叫做 懈怠匹配 ,它的特点是, 在量词作用下的表达式会尽可能疏忽掉满足条件的字符 ,只有在正则表达式整体在尝试匹配却没有匹配胜利的状况下,疏忽优先的这部分才会去 匹配满足条件的那些字符,好让整体可能匹配胜利。

对于".*?",它的匹配过程如下所示

  • 第一步:正则表达式的 " 开始匹配测试用例的第一个字符,发现测试用例的第一个字符也是 ",于是正则表达式中的" 局部匹配胜利。而后开始持续上面的匹配。
  • 第二步:正则表达式的 .*? 是一个整体,示意 . 能够匹配 0 次或者无数次,然而尽量不匹配 。于是,刚开始,.*? 就什么也没有匹配
  • 第三步:正则表达式的 " 开始进行匹配,发现 h 不满足匹配,于是须要进行回溯。也就是 .*? 要尝试匹配满足条件的字符,为了前面的 " 可能匹配胜利。于是 .*? 匹配了 h,前面的" 发现下一个字符是 e,还是不能够匹配胜利,而后再次进行回溯。始终到.*? 匹配了 hello,正则表达式的" 发现此时前面的 " 是能够匹配胜利的,至此整个表达式匹配胜利了一次。
  • 第四步:在接下来的字符串中,反复上述的 1 - 3 步骤,始终到字符串的结尾。

咱们能够通过上面的图来直观的感受一下。

对于疏忽优先,咱们也能够拿生存中的一些场景作类比。比方你当初是一个在外地上大学的学生,你放假在家,当初开学了,你筹备回到学校。这时候你的妈妈会让你带很多吃的用的和穿的。你尽管能够带这些货色,然而你不想带这些大包小包的货色(类比懈怠匹配),感觉很麻烦。然而你晓得,如果你不带一些去学校的话,你妈妈会怄气的(前面的 " 须要胜利匹配)。所以你就拿了一些比拟不便携带的,剩下的就不带走了。这样至多不会让你妈妈怄气,你也不必带那么多货色,达到了单方都还算称心的后果(正则表达式匹配胜利)

自测的练习题目

对于正则表达式量词的匹配形式,咱们解说了匹配优先,和疏忽优先的匹配形式。置信大家看过下面的文章之后,应该可能很好地把握了。那咱们接下来就来做一些对于这两种匹配形式的练习题。

  • 第一题:匹配一些简略的 HTML 标签

给出的测试用例如下:

<a>link</a> <span>hello</span><span>world</span> <button>click</button>

匹配的后果如下图所示:

  • 第二题:匹配字符串中带有¥前缀的格式化数字

给出的测试用例如下:

aaa¥100aaa
aaa¥a100aaa
aaa¥1a00aaa
aaa¥100.00aaa
aaa¥100,000,000.00aaa

匹配的后果如下图所示:

如果你晓得这两道题目的答案的话,也欢送在文章上面留言。大家能够一起探讨一下,加深对本篇文章常识的把握和了解水平。

对于正则表达式量词匹配形式解说的上篇到这里就完结啦,如果你感觉这篇文章对你有帮忙的话,不要遗记点赞和转发哟。如果大家有什么疑难和倡议都能够在这里提出来。欢送大家关注我的公众号 关山不难越,咱们一起学习更多有用的正则常识,一起提高。

正文完
 0