正则表达式数字和零宽度断言在上一篇文章中,我向大家展示了正则匹配的过程,希望大家仔细阅读。https://segmentfault.com/a/11...下面我们主要讨论两部分:1.正则表达式的位数,2.零宽断言正则表达式的位数。需要正则表达式,一个很常用的操作就是百度。让我们看看我能不能找到一个满足我需要的。有时候你会发现,比如手机验证,密码验证,邮箱验证。但是很多人在网上往往不理解规律性的含义。这是对学习规律性的误解。在我看来,我们应该学习正则表达式:了解它的匹配过程,然后理解正则表达式,最后自己写正则表达式。下面主要介绍如何理解正则表达式。理解正则表达式的关键——表达式匹配的字符个数。让我们举个例子。//在第一个例子中,表达式匹配4个字符,一个“非语法关键字”字符将占据一个位置。varreg1=/abcd/;//在第一个示例中,表达式匹配5个字符(首先是ab,然后是abc中的任意一个,然后是cd)。说明:[]范围内的内容可以占一个位置,不管里面放多少东西都是or。varreg2=/ab[abc]cd/;//第三个例子,匹配5个或更多(先是ab,然后是abc中的任意一个,然后是c,最后是一个d或多个d),这类函数类似于*,{1,5}varreg3=/ab[abc]cd+/;//第四个例子,匹配4个(三个字符abd,一个[])。像^、$这样标记位置的语法不占用单个字符,只需要一些位置。varreg4=/^ab[abc]d$///第五个例子(这是一个真实的例子,不知道大家能不能看得快),匹配无数个字符(首选是匹配##item#七个字符,然后匹配任意数量的任意字符,后面跟匹配字符#item##)//inthis?别贪心模式,其实这里是遇到的第一个#item##。关于贪心模式,希望大家自己去查。varreg5=/((##item#)([\w|\W])+?(#item##))/我正在使用一个示例,我希望尽可能直截了当以使其更容易每个人都明白。我这里的例子并没有列出全部情况。如果你有什么不懂的正则表达式,不确定匹配多少位,请在下方留言,我看到后会给你答复。接下来,让我们谈谈零宽度断言。零宽度断言零宽度断言很清楚。我们需要简单介绍一下为什么会这样。它存在要解决什么问题?这种存在是为了解决我们的一些特定需求,不需要展览空间。例如:将字符串的首尾替换为“#”(/^|$/,需要找首尾,且没有真正的字符),在字符串中每三位加一个逗号,并且不能跟在字符串中的b是数字等,这些都是定位的条件,但是这些条件不占地方。表示位置不占字符的语法如下:^$\b\B(?=)(?!)^(caret)匹配开头,多行匹配匹配行首.$(美元符号)匹配结尾,或多行匹配中一行的结尾。b是词边界,具体是w和W之间的位置,包括w和^之间的位置,也包括w和$之间的位置。b是b的反义词,不是词界。比如字符串的所有位置都减去b,剩下的都是B的。上面四个比较简单,尤其是^和$,这里就不多说了。下面主要讲一下这两个(?=)和(?!)(?=P)此刻位置后面应该跟着P模式,这个模式不仅仅是一个字符,更是一个复杂的正则。例如(?=l),(?=[abc]ede),(?=\d+)(?!p)此时指示的位置后面应该跟一个不是P模式的位置,正好与前一个相反。举几个例子帮助你理解//第一个例子,正则表达式,要求在cate之后的position后面有一个数字。后面应该有数字,后面就可以了。\d是不可或缺的,也说明(?=)不占地方。varreg6=/cate(?=\d)\dok/varstr='cate3ok'str.match(reg6);//cate3ok//第二个例子,如果我们要在##p#和#p##之间有一串ok字符在前面的字符串中。varreg7=/##p#(?=.*ok).*#p##/varstr1='##p#fsdfsdokdfsdfs#p##'reg7.test(str1);//第三个例子,如果我们希望在##p#和#p##这个字符串之前的字符串中有ok字符。如果字符串中有两段##p#怎么办?varreg7=/##p#(?=.*ok).*#p##/varstr1='##p#fsokfs#p####p#fsfs#p##'str1.match(reg7)//##p#fsokfs#p####p#fsfs#p##这个结果不是我们想要的。不知道大家能不能搞清楚?//让我们改变规律varreg8=/##p#(?=.*ok).*?#p##/str1.match(reg8)//##p#fsokfs#p##//看起来没错,不过我们换个字符串,换一下两段的位置##p#varstr2='##p#fsfs#p####p#fsokfs#p##';str2.match(reg8)//##p#fsfs#p##又错了。我不知道我是否能理解这个地方。//让我们再次更改正则表达式varreg9=/##p#(?=(.(?!#p##))*ok).*?#p##/;str2.match(reg9);//##p#fsokfs#p##这次是对的。我想解释一下最后一个正则表达式。第一选择是?#p##这个地方?是不是告诉正则表达式我没有使用贪心模式,(?=(.(?!#p##)).*ok).*这部分先不看?部分,记为P(?=p.*ok).*,这部分的意思是我们需要任意字符,任意字符后任意位置出现OK。最后一个在里面?part,其实也是这个任意字符的条件,要求任何字符后面都不能跟#p##字符串。就是这样。我知道这可能很难理解清楚,希望大家多看多想。如果您有任何问题,请在下方留言。作者:易启修——philips
