re = /\s{1,}(male)\.$/gi
"A girl is a female, and a boy is a male.".match(re);
这导致“男性”。
我想要的是“男性”
我把男性放在括号中,但我会抓住那个群体。
感谢您的帮助
答案 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