【问题标题】:JavaScript regex to capture two or three words in separate groups [duplicate]JavaScript正则表达式在不同的组中捕获两个或三个单词[重复]
【发布时间】:2018-07-16 05:47:02
【问题描述】:

我正在尝试匹配(连同捕获组)以下输入:

favorite colors are red orange yellow
favorite colors are red orange

第一个词组有 3 种颜色,第二个词组有 2 种颜色。

我的正则表达式是:

/favorite colors are (.*) (.*) (.*)/i

但是,此正则表达式仅在我有 3 种颜色时才有效。我怎样才能重写这个正则表达式,以便它也可以接受 2 种颜色?我试过添加一个?到 3 个捕获组的末尾,但这要求我的输入短语有一个尾随空格。

如果未提供第三种颜色,我不介意在捕获组中将第三种颜色设为空。

根据http://stackoverflow.com/questions/12451731 帖子,建议修复为/favorite colors are (.*) (.*)(?: (.*))?/i,但是,它不起作用,因为它匹配红色橙色作为第 1 组,黄色作为第 2 组,而红色应该在第 1 组中,橙色应该属于第 2 组,黄色应属于第 3 组。http://stackoverflow.com/questions/8991178 帖子建议使用[^\s],但事实证明它匹配尾随点。

【问题讨论】:

  • 您可能希望确保捕获的组只接受单个单词,而不是(.*)
  • 您好,请查看重复的主题,如果它没有给您一些见解,请相应地编辑您的问题。
  • @revo 这不是that question 的骗子,因为它不是只是关于使正则表达式的一部分成为可选的。请参阅favorite colors are (.*) (.*)(?: (.*))?,它不起作用。
  • 我为它添加了另一个骗子。

标签: javascript regex


【解决方案1】:

favorite colors are (.*) (.*) (.*) 模式要求第 1 组和第 2 组之间以及第 2 组和第 3 组之间至少有一个空格。

此外,要仅匹配单词字符,您需要使用\w 而不是匹配除换行符以外的任何字符的.

您可以使用带有\w+\w+ 模式的可选非捕获组替换.* 模式:

/favorite colors are (\w+) (\w+)(?: (\w+))?/i

this regex demo

这里,(?: (\w+))? 匹配一个可选的序列模式,一个空格和 1+ 个单词字符(字母、数字或_)被捕获到第 3 组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2014-09-10
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多