Javascript正则表达式匹配捕获返回整个匹配,而不是组

时间:2011-03-10 19:20:33

标签: javascript regex

re = /\s{1,}(male)\.$/gi

"A girl is a female, and a boy is a male.".match(re);

这导致“男性”。

我想要的是“男性”

我把男性放在括号中,但我会抓住那个群体。

感谢您的帮助

3 个答案:

答案 0 :(得分:14)

您需要在正则表达式中取出'g'选项:

re = /\s{1,}(male)\.$/i

产量

[" male.", "male"]

答案 1 :(得分:10)

我知道这个问题已经很久了,但这里的所有答案都是完全错误的。真正让我感到困惑的是,答案并没有为社区添加任何有用的东西。

<强>第一

问题:为什么正则表达式导致" male."

re = /\s{1,}(male)\.$/gi

"A girl is a female, and a boy is a male.".match(re);

答案:因为" male."是唯一的匹配。

问题:为什么(male)没有被退回?

答案:因为使用match()标志时,g不会返回捕获的组。

来自dcoumentation:

  

如果正则表达式包含g标志,则该方法返回一个   包含所有匹配的子字符串而不是匹配对象的数组。   未归还捕获的群组。如果没有匹配,则该方法   返回null。

<强>第二

让我们分解正则表达式,找出它真正匹配的模式。

<强> 模式

  • \s{1,}表示至少匹配一个空格。这是一样的 \s+
  • (male)表示匹配male并抓住它。
  • \.$表示匹配输入结尾的句号。

<强> 标志

  • g表示查找所有匹配项,而不是在第一场比赛后停止
  • i表示忽略大小写

然而,所有这些模式都粘在一起。这些模式并不是独立的。

正则表达式匹配的是:一个空格后跟“男性”,后跟输入结尾的.。在示例中,匹配的输入的唯一部分是" male."

<强>第三

那么,当我们删除g标志时会发生什么?

  

如果字符串与表达式匹配,它将返回一个包含整个匹配字符串作为第一个元素的Array,后跟括号中捕获的任何结果。如果没有匹配项,则返回null。

     

如果正则表达式不包含g标志,str.match()将返回与RegExp.exec()相同的结果。返回的Array有一个额外的input属性,它包含已解析的原始字符串。此外,它还有一个index属性,表示字符串中匹配的从零开始的索引。

re = /\s{1,}(male)\.$/i

"A girl is a female, and a boy is a male.".match(re);

新结果是一个带有一些额外属性的数组:index和input。

res: Array(2)
    0 : " male."
    1 : "male"
    groups : undefined
    index : 34
    input : "A girl is a female, and a boy is a male."
    length : 2

操纵结果很容易得到你想要的东西。但是....

<强>四

我真的,真的,真的希望正则表达式只返回"male"。猜猜是什么,你真的,真的,真正用真正的正则表达式做到了。

re = /male(?=\.$)(?!=[^\b])/gi


"A girl is a female, and a boy is a male.".match(re);

这导致"male";正是提问者所要求的。

请注意g标志回来了吗?它在这个例子中没有区别,但稍后会有所不同。

让我们分解一下:

  • male匹配male;咄。
  • (?=\.$)表示只有在输入结尾后跟.后才匹配上一个模式。
  • (?!=[^\b])表示匹配前一个模式(如果前面有空白字符)。

将所有内容放在一起,male(?=\.$)(?!=[^\b])表示匹配男性,如果后面跟着输入结束的句点,则匹配male如果前面有空白字符。

<强>最后

g旗帜怎么样?我们能看到它做点什么吗?

正如之前的用户所说,\.$使g标志无关紧要,因为输入字符只能有一端;与匹配无关,因为我们发现它会影响macth()的输出。

如果我们将输入更改为A girl is a female, and a boy is a male. A female likes a good male.

,该怎么办?

摆脱$,看看g标志是否有效。

re = /male(?=\.)(?!=[^\b])/ig

res = "A girl is a female, and a boy is a male. A female likes a good male.".match(re);

现在,输出是一个只是匹配的数组! ['male','male']

我现在感觉好多了。

答案 2 :(得分:0)

在String.prototype.match()中,不会返回捕获的组。

如果需要捕获组,请使用RegExp.prototype.exec()。它将返回一个数组,第一个元素将是整个匹配,下一个元素将捕获捕获组。

var regexObj = /\s{1,}(male)\.$/gi;

console.log(regexObj.exec('A girl is a female, and a boy is a male.'));

将输出:

[' male.', 'male'] // Second element is your capture group