Javascript正则表达式在组中捕获单词和分隔符

Javascript正则表达式在组中捕获单词和分隔符,javascript,regex,Javascript,Regex,我有一个Javascript正则表达式,它捕获了两个组。第一个是捕获单词Hello,第二个是捕获以下分隔符,如,等等,给出一个字符串你好!我听到了 这是我正在使用的表达式: /(\b[^\s]+\b)?(\W+)/g 。我遇到的问题是,对于没有以下分隔符的情况,我希望捕获源字符串中的最后一个单词(以捕获组1)。在我链接到您的示例中,您可以看到最后一个单词部分未被捕获 我尝试了许多变体,但最终的匹配数是无限的。您可以使用以下正则表达式: /(\S+)(\W*)/g 最后一组中的(\W*)将使其

我有一个Javascript正则表达式,它捕获了两个组。第一个是捕获单词
Hello
,第二个是捕获以下分隔符,如
,等等,给出一个字符串
你好!我听到了

这是我正在使用的表达式:

/(\b[^\s]+\b)?(\W+)/g
。我遇到的问题是,对于没有以下分隔符的情况,我希望捕获源字符串中的最后一个单词(以捕获组1)。在我链接到您的示例中,您可以看到最后一个单词
部分
未被捕获


我尝试了许多变体,但最终的匹配数是无限的。

您可以使用以下正则表达式:

/(\S+)(\W*)/g
最后一组中的
(\W*)
将使其匹配0个或更多非单词字符

也不需要在
\S+
周围使用单词边界

更新:如何:

(\b[^\s]+\b)?(\W*)-->匹配空字符串(如@anubhava所述)

(\b[^\s]+\b)?(?:(\W+)|$)-->与空字符串不匹配

var re=/(\b[^\s]+\b)?(?:(\W+)$)/g;
巴尔奇河是美国俄勒冈州威拉米特河的一条3.5英里(5.6公里)的支流。这条小溪从Tualatin山脉的顶部开始,向东流过一个峡谷,穿过波特兰的一个大型市政公园森林公园。然后,它进入一条管道,一直埋在地下,直到到达河流。丹福德沼泽,植被之后。62种哺乳动物和112多种鸟类使用森林公园。这条溪流中栖息着一小群沿海的鳟鱼,2005年,这条溪流是波特兰唯一达到国家细菌、温度和溶解氧标准的主要水体。虽然自然保护区覆盖了流域的大部分中上部,但工业用地占据了流域的下部;
var-m;
while((m=re.exec(str))!==null){
如果(m.index==re.lastIndex){
re.lastIndex++;
}
document.getElementById(“r”).innerHTML++=“第1组:”+m[1]+“
第2组:“+m[2]+”

”; }

谢谢,但是这个解决方案有几个问题:第一)第一个点不是用$2捕获的。第二)我真的想把整个
3.5英里
记录在一张1美元的单张上。越来越近:)。不过,“单词”部分,即捕获组$1,应该以
\b
开始,以
\b
结束。在
\S+
周围使用
\b
将使其跳过
中的点。Balch
还应注意
(\b\S+\b)?(\W*)
将使其与空字符串匹配
,这也是我实际尝试过的字符串,但出于某种原因,我得到了无限多的匹配。我很困惑——我想我不确定你当时想捕捉什么。你能在一个输入示例中发布你希望捕获的内容吗?为什么是无限的?你有什么问题?请看一看。@stribizev that
re.lastIndex++成功了。我必须承认(似乎这并不明显)我不完全理解Javascript中的exec方法。@NumericOverflow:我建议您在答案中添加JS代码。