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'].
我现在感觉好多了.