0

在 javascript 中使用正则表达式时,会创建^\[(.*?)\]$|(.*)一个空组 ( undefined)。我猜这是由于 OR 尝试第一场比赛并在失败时创建一个空组,或者与第二组反之亦然。有什么办法可以在javascript中使用 regex.exec(string) 时只返回一个组?

我的测试代码如下;

var regex = /^\[(.*?)\]$|(.*)/;

console.log(regex.exec("[test]")); // ["[test]", "test", undefined]
console.log(regex.exec("test")); // ["test", undefined, "test"]
4

3 回答 3

1

只需将所有内容包装在一组中:

var regex = /^(\[(.*?)\]$|(.*))/;
regex.exec("[test]")
> ["[test]", "[test]", "test", undefined]
regex.exec("test")
> ["test", "test", undefined, "test"]

结果将始终是第 1 组。

要摆脱内部群体,让它们不被捕获:

> var regex = /^(\[(?:.*?)\]$|(?:.*))/;
regex.exec("[test]")
> ["[test]", "[test]"]
regex.exec("test")
> ["test", "test"]
于 2013-11-10T16:57:36.000 回答
1

您可以在正则表达式中使方括号可选:

^\[?(.*?)\]?$

并拥有一切match group #1

于 2013-11-10T17:01:54.953 回答
1

好吧,当第二组匹配整个输入时,为什么还要对第二组使用正则表达式?

var input = '[test]',
    match = input.match(/^\[(.*?)\]$/),
    result = match? match[1] : input;

console.log(result);
于 2013-11-10T17:23:02.583 回答