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

jam*_*mes 12 javascript regex

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

"A girl is a female, and a boy is a male.".match(re);
Run Code Online (Sandbox Code Playgroud)

这导致"男性".

我想要的是"男性"

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

谢谢您的帮助

Mat*_*ing 15

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

re = /\s{1,}(male)\.$/i
Run Code Online (Sandbox Code Playgroud)

产量

[" male.", "male"]
Run Code Online (Sandbox Code Playgroud)


shr*_*use 14

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

第一

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

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

"A girl is a female, and a boy is a male.".match(re);
Run Code Online (Sandbox Code Playgroud)

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

问题:为什么没有(male)归还?

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

来自dcoumentation:

如果正则表达式包含g标志,则该方法返回包含所有匹配的子字符串而不是匹配对象的Array. 捕获的组不会被退回.如果没有匹配项,则该方法返回null.

第二

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

模式

  • \s{1,}意味着匹配至少一个空格.这是一样的 \s+.
  • (male)意味着匹配male并捕获它.
  • \.$ 表示匹配输入结束时的句点.

  • g 意味着找到所有匹配而不是在第一场比赛后停止
  • i 意味着忽略大小写

但是,所有这些模式都粘在了一起.这些模式并不是独立的.

正则表达式匹配的是:一个空格后跟"男性",后跟.输入结尾处的a.在示例中,匹配的输入的唯一部分是" 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);
Run Code Online (Sandbox Code Playgroud)

新结果是一个带有一些额外属性的数组:索引和输入.

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
Run Code Online (Sandbox Code Playgroud)

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

第四

我真的,真的,真的希望正则表达式只返回"male".猜猜是什么,你真的,真的,真正用真正的正则表达式来做到这一点.

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


"A girl is a female, and a boy is a male.".match(re);
Run Code Online (Sandbox Code Playgroud)

这导致"male"; 究竟提问者要求的是什么.

请注意,g国旗又回来了?它在这个例子中没有任何区别,但稍后会有所不同.

让我们分解一下:

  • male比赛male; 咄.
  • (?=\.$)表示只有.在输入结束时后跟a后才匹配前一个模式.
  • (?!=[^\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);
Run Code Online (Sandbox Code Playgroud)

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

我现在感觉好多了.