正则匹配之正预测先行模式

  正预测先行,至于为啥叫这个名字我也不清楚,自行谷歌百度。简单的说就是先搜索这个模式中的内容,但不计算长度,也名零宽先行断言,第一遍反正我是不懂的。

  原始需求是这样的,我要匹配一个字符串,其中字符串中要包含字符串ABC或123,同时字符串的长度不能小于10个长度。如果我们单独看两个条件都很简单,分开处理的逻辑分别为:

/(ABC|123)/.test("TEST123TEST");
/^[\s\S]{10,}$/.test("12345678901")

  这样的逻辑很容易写出来,甚至可以很简单。但是要将两者结合起来就犯难了。我们就很容易出现如下的几种正则:

/^(abc)*([0-9]{10,})$/
/(abc)+|^[0-9]{10,}$/
/(abc)+&^[0-9]{10,}$/

  实际上,在不了解这个的情况下,很难写出合适的表达式,因为难点在于如果区分在前在后居中,且同时考虑其长度的匹配。但真实往往结果都很简单,可以说是出乎意料的简单。正确的写法如下:

/^(?=.*(ABC|123)).{10,}$/.test("123456ABC4")

正则测试

  关键在哪里呢?“(?=)”这个东西就是关键,当出现则个时即表示先搜索括号中的内容,同时不会将数据进行保存。简单的说就是先找一遍,有就匹配,然后接着找后面的内容。当然如果这个不在最前面,如/^45(?=.*(ABC|123)).{10,}$/这样的正则还是会优先查询45,然后在接着搜索断言中的内容。最后通过.匹配任意非换行符。结果就是这样,搞定问题。

  正则难么,真难!详见 https://msdn.microsoft.com/zh-cn/library/ae5bf541%28v=vs.100%29.aspx,一直以来,微软的文档都是很全的,看看呗!

1条评论在“正则匹配之正预测先行模式”

写下你最简单的想法