2

我有一个很长的正则表达式,它生成以匹配 URL,例如

/^\/([^\/.?]+)(?:\/([^\/.?]+)(?:\/([^\/.?]+)(?:\.([^\/.?]+))?)?)?$/

将匹配:

/foo/bar/1.html

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

在 Javascript 中,我希望在用户键入 url 时获得匹配的部分(如预先输入)。例如,如果他们输入:

/foo

它会告诉我这/foo是匹配的,但整个正则表达式并不满意。Ruby 可以返回一个仅包含匹配部分元素的数组,例如:['foo', nil, nil, nil]这可能吗,或者在 Javascript 中容易做到吗?

4

1 回答 1

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 正则表达式工作,我不能推荐这个库。

于 2012-12-26T23:46:50.807 回答