我正在尝试使用正则表达式在JavaScript中获取字符串的前两个单词。
我正在使用:
var str = "Reed Hastings, CEO Netflix";
var res = str.match(/^\s*(\w+ \w+)/);
回吐 - Reed Hastings,Reed Hastings
它有点工作,但任何人都可以告诉我它为什么会重复?
答案 0 :(得分:3)
......为什么会重复?
match
返回一个数组,其中第一个条目是整个表达式的整体匹配,后面跟着您在正则表达式中定义的每个捕获组的内容。由于您已定义了捕获组,因此您的阵列有两个条目。如果任何内容与开头的\s*
匹配,则第一个条目将具有前导空格;第二个不会,因为它只有组中的内容。
这是一个简单的例子:
var rex = /This is a test of (.*)$/;
var str = "This is a test of something really cool";
var match = str.match(rex);
match.forEach(function(entry, index) {
snippet.log(index + ": '" + entry + "'");
});
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
有时在第二个单词之后有一个逗号,其他时候只有一个空格
你的表达式不匹配,它只允许一个空格(并且它只允许一个)。如果你想允许逗号,也许还有任意数量的空格,那么:
/^\s*(\w+[,\s]+\w+)/
或者,如果您只想允许一个逗号,可能两边都有空格
/^\s*(\w+\s*,?\s*+\w+)/
您可能还会考虑两个捕获组(每个单词一个):
/^\s*(\w+)\s*,?\s*+(\w+)/
示例:强>
var str = "Reed Hastings, CEO Netflix";
var res = str.match(/^\s*(\w+)\s*,?\s*(\w+)/);
if (res) {
snippet.log("Word 1: '" + res[1] + "'");
snippet.log("Word 2: '" + res[2] + "'");
} else {
snippet.log("String didn't match");
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
答案 1 :(得分:0)
var str = "How are you doing today?";
var wordsArray = str.split(" ");
var result = wordsArray[0] + " " + wordsArray[1];
结果将是“如何”。
答案 2 :(得分:0)
一个正则表达式解决方案,只从一行的开头抓取单词(甚至用标点符号分割):
var re = /^([a-z]+)[\s,;:]+([a-z]+)/i;
var str = 'Reed Hastings, CEO Netflix';
var m;
if ((m = re.exec(str)) !== null) {
document.getElementById("res").innerHTML = m[1] + " " + m[2];
}
&#13;
<div id="res"/>
&#13;
T.J.Crowder向您解释了为什么在match
之后有2个条目,主要的一点是在正则表达式对象中始终有第0个组等于完全匹配。 N(stringsInArray) = N(capturing groups) + 1
。
答案 3 :(得分:0)
删除前面的^并使表达式为全局。 ^表示字符串的开头,因此它只匹配Reed Hastings。
str.match(/\s*(\w+ \w+)/g)