Javascript中的部分正则表达式匹配

时间:2012-12-26 23:42:09

标签: javascript regex

我生成一个很长的正则表达式来匹配像

这样的网址
/^\/([^\/.?]+)(?:\/([^\/.?]+)(?:\/([^\/.?]+)(?:\.([^\/.?]+))?)?)?$/

匹配:

/foo/bar/1.html

['foo', 'bar', '1', 'html']

在Javascript中,我想获得匹配的部分,因为用户键入了url(比如typeahead)。例如,如果他们输入:

/foo

它会告诉我/foo已匹配,但整个正则表达式尚未满足。 Ruby可以返回一个只包含匹配的部分元素的数组:['foo', nil, nil, nil]这是可能的,还是在Javascript中很容易做到?

1 个答案:

答案 0 :(得分:2)

@minitech基本上给出了一半的答案:在每个组之后使用?,然后即使它们丢失,你也能够匹配正则表达式。一旦你能做到这一点,那么只需检查正则表达式结果的组,看看哪些位已经匹配,哪些位没有匹配。

例如:

/^\/([^\/.?]+)?(?:\/([^\/.?]+)?(?:\/([^\/.?]+)?(?:\.([^\/.?]+))?)?)?$/.exec('/ab/c')

会回来:

["/ab:c", "ab:c", "c", undefined, undefined]

通过检查并查看返回的第四个值是否未定义,您可以确定哪些块未输入。

作为旁注,如果你要使用这样的大量正则表达式,你可能很容易失去理智,只是想跟踪哪个组是哪个。出于这个原因,我强烈建议使用“命名组”正则表达式。如果您使用XRegxp库(http://xregexp.com/),则可以创建这些正常的正则表达式,如下所示:

var result = XRegExp.exec('/ab/c', /^\/(?<fooPart>[^\/.?]+)?(?<barPart>?:\/([^\/.?]+)?(?:\/([^\/.?]+)?(?:\.([^\/.?]+))?)?)?$/)
var fooPart = result.fooPart

该库还具有其他便利功能,例如注释,可以同样有助于控制正则表达式。如果你只使用这一个正则表达式它可能有点过分,但如果你正在做大量的JS正则表达式工作,我不能推荐这个库。