【问题标题】:Change the capture group order from .match()从 .match() 更改捕获组顺序
【发布时间】:2014-09-05 01:11:15
【问题描述】:

在 JS 中,如果我有这样的正则表达式:

new RegExp('^(.*?) in the year ([0-9]{1,4})$|^([0-9]{1,4}) is the year$')

那么如何确保“年份”部分始终是同一个捕获组,以便我可以像matches[2] 一样访问它?目前,如果匹配正则表达式的第一部分,则年份为matches[2],但第二部分为matches[1]。我想改为使它们相同,以便我可以始终如一地检索相同的值。

另外请记住,我仍想在开始时捕获(.*?),所以简单地删除那里的括号对我没有帮助。

【问题讨论】:

  • 您是否使用其他捕获组?或者我们可以让它们成为非捕获组吗? “脏”解决方案将是以下^(.*?) in the year ([0-9]{1,4})$|^()([0-9]{1,4}) is the year$ 一个更干净的解决方案是将上述解决方案分成两个正则表达式调用。

标签: javascript regex match wildcard capture


【解决方案1】:

年份永远不会出现在matches[1]。捕获组编号是根据整个正则表达式分配的,而不是替代匹配项。如果其中一个选项不匹配,则其所有捕获组都将为空。

因此,如果第一个替代匹配,年份将在 matches[2]。如果第二个替代匹配,它将位于matches[3]。然后,您可以从匹配的任何一个中获取年份:

var year = matches[2] || matches[3];

顺便说一句,当正则表达式是文字字符串时,不需要使用new RegExp。使用正则表达式文字

/^(.*?) in the year ([0-9]{1,4})$|^([0-9]{1,4}) is the year$/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多