如何在条件匹配组Javascript正则表达式中访问导致匹配的表达式?

时间:2018-02-07 15:22:23

标签: javascript regex

我有一个像/(sun|\bmoon)/这样的条件匹配分组正则表达式。当我在字符串中访问匹配项时,我希望能够看到导致我匹配的表达式。

let regex = /(sun|\bmoon)/
let match = regex.exec('moon')
// return '\bmoon' ??

这可能吗?

4 个答案:

答案 0 :(得分:1)

JavaScript的RegExp目前没有方法来显示正则表达式模式的哪个部分匹配。我不相信这会在很快(甚至是永远)的任何时候实施,但这是我自己的看法。相反,您可以使用我在下面的代码段中显示的两个单独的模式。



let regexes = [/sun/, /\bmoon/]
let str = 'moon'
regexes.forEach(function(regex) {
  let m = regex.exec(str)
  if (m == null) return
  console.log(`${regex}: ${m}`)
0})




答案 1 :(得分:1)

捕获组存在的原因是识别与子表达式匹配的输入字符串部分。在您的示例中,匹配的子表达式为sun|\bmoon(捕获组的内容)。

如果你想知道两个子表达式中的哪一个与输入字符串实际匹配,你所要做的就是将它们放入较小的捕获组中:

let regex = /((sun)|(\bmoon))/
let match = regex.exec('moon')
# Array [ "moon", "moon", undefined, "moon" ]

返回的数组包含与整个regex(位置0)匹配的字符串以及与其他位置的每个捕获组匹配的子字符串。

捕获组按照它们打开的顺序从1开始计算。 在上面的示例中,"moon"undefined"moon"对应于捕获组(按顺序)((sun)|(\bmoon))(sun)(\bmoon)。< / p>

通过检查match[2]match[3]的值,您可以找到输入字符串是否与sun匹配(否,它是undefined)或\bmoon(是)。

您可以将non-capturing groups用于您不需要捕获但无法删除的群组,因为这些群组是出于分组目的所必需的。

答案 2 :(得分:0)

您无法看到模式中所写的正则表达式,但您可以在exec返回的数组中看到匹配的内容。

答案 3 :(得分:0)

你的意思是?

console.log(match[0]);

或者你想要匹配的完整表达式?喜欢\ bmoon?如果是这样,你就看不到它。