以图明志

开源项目与工具

高效准确的正则表达式的书写方法

避免误匹配与漏匹配
如果纯粹是为了挑战自己的正则水平,用来实现一些特效(例如使用正则表达式计算质数、解线性方程),效率不是问题;如果所写的正则表达式只是为了满足一两次、几十次的运行,优化与否区别也不太大。但是,如果所写的正则表达式会百万次、千万次地运行,效率就是很大的问题了。

开源项目与工具

正则入门:非获取匹配

只进行匹配,不保存结果供以后引用
我们首先查看一下表达式的区别,为了要使用后向引用,我们用“(”和“)”把“[\w.]+\b”包起来,使它成为一个子模式。我们知道,只有这样,才可以用 $1 去引用它,这里,我们发现使用子模式的一个作用:系统会在幕后将所有的子模式保存起来,以供后向引用使用(包含查找时的后向引用 和 替换时的后向引用)。

开源项目与工具

正则入门:后向引用文本替换

替换电话号码格式
正则表达式的三部曲应该是:1、查找;2、引用匹配了的文本(后向引用);3、有选择地替换文本。需要注意的是:大部分语言的正则表达式实现,在查找中,使用后向引用来代表一个子模式,其语法是“\数字”;而在替换中,其语法是“$数字”。

开源项目与工具

正则入门:“或”匹配

reg1|reg2
在正则表达式中,可以使用“|”将一个表达式拆分成两部分“reg1|reg2”,它的意思是: 匹配所有符合表达式 reg1 的文本 或者 符合表达式 reg2 的文本。有的时候,我们要取消某段文字中的加粗、斜体等效果,我们想匹配所有的“<b>”、“</b>”或者 “<i>”、“</i>”,然后把它们替换成空。

开源项目与工具

正则入门:子模式

用小括号将模式中的子字符串括起来
在正则表达式中,可以使用“(”和“)”将模式中的子字符串括起来,以形成一个子模式。将子模式视为一个整体时,那么它就相当于一个单个字符。我们可以将匹配过程理解成这样:子模式“(<br\s*\/?>)”首先匹配所有“<br>”、“<br/>”或“<br />”;然后,将每一个匹配结果视为一个整体(相当于单个字符);接着,匹配这个整体连续出现两次或以上的文本。

开源项目与工具

谈谈正则表达式常用的一些技巧

技巧总结
正则表达式在现在web的应用当中,如表单验证,url解析等,应用非常方便,比起普通的字符串解析性能上也高出不少。这里就做一些关于正则表达式通用技巧的个人小总结。头尾的^$即是限定匹配的必须是整个字符串,而不是其中一部分,这对于表单验证里验证完整的合法输入很有用。

开源项目与工具

正则入门:匹配文本首和尾

^开头与结尾$
有的时候,我们想要匹配的字符串必须位于全部文本的首位。在正则表达式中,可以在 匹配模式 的第一个字符前添加 “^”,以匹配 满足模式且位于全部文本之首的字符串。可以将它的匹配方式理解成这样:假设不存在“^”,进行一个正常匹配,将所有匹配的文本保存到匹配集合中。

开源项目与工具

正则入门:匹配非单词边界

匹配不在边界的字符
和 前面 匹配特定类型字符有些相似,有了“\b”,自然有“\B”,它用来匹配不在边界的字符。我们继续拿上面的例子做示范,来看看“\Bmagic”匹配的效果。它的匹配规则是这样的:字符“m”必须出现,但是不能位于字符串首位;随后跟两个固定字符a, g, i, c。

开源项目与工具

正则入门:边界的定义与相对性

究竟什么才算边界?
讲了这么多,还漏掉了一个重要的内容:究竟什么才算边界?通常情况下,以 空格、段落首行、段落末尾、逗号、句号 等符号作为边界,值得注意的是,分隔符“-”也可以作为边界。其实很好理解,从“-”的字面意思:分隔符,大致就可以想到了。实际上,在英语中,它是用来做单词分隔的。

开源项目与工具

正则入门:匹配单词边界

\bmagic\b
可见,通常情况下,我们只希望匹配 magic ,而不希望匹配 nowamagic 中出现的 magic。正则表达式中,可以在 字符 前加“\b”,来匹配其 后面 的字符位于字符串首位的字符。以后提到 字符,指:单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、转义过的特殊字符“\[” 或者 单个任意字符(即“.”)。

开源项目与工具

正则入门:两个匹配模式

一个?号与两个?号
现在请回顾一下上面贪婪、惰性匹配语法的表,有两个匹配模式比较有意思:一个是“{n}”,对于这种形式的匹配,由于它精确地要求匹配 n 个字符,所以无所谓贪婪还是惰性,尽管“{n}?”也是正确的匹配写法,但它的匹配结果总是与“{n}”相同。

开源项目与工具

正则入门:惰性匹配

.*?
惰性匹配(lazy)它会匹配尽可能少的字符,它从第一个字符开始找起,一旦符合条件,立刻保存到匹配集合中,然后继续进行查找。所以说它是懒惰的。我们回顾一下上面 “\d{1,3}” 匹配数字的例子,对于“1234”,当我们使用“\d{1,3}”时,进行的是贪婪匹配,它首先找到“123”(因为“1234”不符合),之后的“4”也符合,所以,找到的匹配是“123”和“4”。

开源项目与工具

正则入门:贪婪匹配

匹配尽可能多的字符
它会匹配尽可能多的字符。它首先看整个字符串,如果不匹配,对字符串进行收缩;遇到可能匹配的文本,停止收缩,对文本进行扩展,当发现匹配的文本时,它不着急将该匹配保存到匹配集合中,而是对文本继续扩展,直到无法继续匹配 或者 扩展完整个字符串,然后将前面最后一个符合匹配的文本(也是最长的)保存起来到匹配集合中。所以说它是贪婪的。

开源项目与工具

正则入门:匹配区间内数目的字符

{最小数目,最大数目}
我们再次考虑 000-999 的匹配:“\d{3}”,尽管它没有错,但它只能匹配精确地匹配 3 位:000、001、002 … 100、101 … 999。而通常,我们需要对于 0、10、99 这样的数也能够匹配,这时,就需要指定可以匹配 1 到 3 位的数字。正则表达式中,使用“{最小数目,最大数目}”的语法来实现。

开源项目与工具

正则入门:匹配固定数目的字符

后面加“{数字}”
尽管“?”、“+”、“*”这三个元字符的出现解决了很多问题,但是,它们并不完善:1.没有办法指定最多匹配多少个字符,比如说,我们要匹配手机号码,那么应该是 11 个数字,而“+”和“*”会匹配尽可能多的数字,不管是 17 个还是 18 个都认为是正确的。2.没有办法指定最少匹配多少个字符,“+”、“*”、“?”,所能提供的最少字符,要么零个,要么一个。

开源项目与工具

正则入门:匹配零个或一个字符串

问号?匹配符
现在加入我们要对单词的正确性进行匹配,对于“flower”这个单词来说,不管是单数“flower”还是复数“flowers”,都是正确的写法,而对于“flowersss”则是不正确的。使用前面的知识,无法完成这样的匹配。正则表达式中,使用“?”来匹配零个或一个字符。其使用方式与“+”和“*”相同。
8 / 9 首页 < Prev 5 6 7 8 9 Next > 尾页 页码: