我有一个像/(sun|\bmoon)/
这样的条件匹配分组正则表达式。当我在字符串中访问匹配项时,我希望能够看到导致我匹配的表达式。
let regex = /(sun|\bmoon)/
let match = regex.exec('moon')
// return '\bmoon' ??
这可能吗?
答案 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?如果是这样,你就看不到它。