使用正则表达式在Javascript中提取字符串的前两个单词

时间:2015-04-27 08:03:32

标签: javascript regex string

我正在尝试使用正则表达式在JavaScript中获取字符串的前两个单词。

我正在使用:

var str = "Reed Hastings, CEO Netflix"; 
var res = str.match(/^\s*(\w+ \w+)/);

回吐 - Reed Hastings,Reed Hastings

它有点工作,但任何人都可以告诉我它为什么会重复?

4 个答案:

答案 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)

一个正则表达式解决方案,只从一行的开头抓取单词(甚至用标点符号分割):

&#13;
&#13;
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;
&#13;
&#13;

T.J.Crowder向您解释了为什么在match之后有2个条目,主要的一点是在正则表达式对象中始终有第0个组等于完全匹配。 N(stringsInArray) = N(capturing groups) + 1

答案 3 :(得分:0)

删除前面的^并使表达式为全局。 ^表示字符串的开头,因此它只匹配Reed Hastings。

str.match(/\s*(\w+ \w+)/g)