我生成一个很长的正则表达式来匹配像
这样的网址/^\/([^\/.?]+)(?:\/([^\/.?]+)(?:\/([^\/.?]+)(?:\.([^\/.?]+))?)?)?$/
匹配:
/foo/bar/1.html
为['foo', 'bar', '1', 'html']
在Javascript中,我想获得匹配的部分,因为用户键入了url(比如typeahead)。例如,如果他们输入:
/foo
它会告诉我/foo
已匹配,但整个正则表达式尚未满足。 Ruby可以返回一个只包含匹配的部分元素的数组:['foo', nil, nil, nil]
这是可能的,还是在Javascript中很容易做到?
答案 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正则表达式工作,我不能推荐这个库。