javascript正则表达式修剪到';空间';和';破折号';或匹配

javascript正则表达式修剪到';空间';和';破折号';或匹配,javascript,regex,match,trim,Javascript,Regex,Match,Trim,我以前也问过类似的问题,得到了正确的回答。不过这次我宁愿尝试在“By”和“Date”后面分别为名称获取两个变量 以下匹配的问题在于,如果名称中有空格或破折号,则无法识别: <p class="review-rating"> By carolyn.fleetwood - Feb 11, 2012 - Something.com </p> <p class="review-rating"> By Dont-work - Feb 11, 2012 -

我以前也问过类似的问题,得到了正确的回答。不过这次我宁愿尝试在“By”和“Date”后面分别为名称获取两个变量

以下匹配的问题在于,如果名称中有空格或破折号,则无法识别:

<p class="review-rating">
 By carolyn.fleetwood
 - Feb 11, 2012
 -
 Something.com
</p>
<p class="review-rating">
 By Dont-work
 - Feb 11, 2012
 -
 Something.com
</p>
<p class="review-rating">
 By wont work
 - Feb 11, 2012
 -
 Something.com
</p>

$('.review-rating').each(function() {
    var matches = $(this).text().match(/\s*By\s+([\w.]+)\s*-\s*([\w, ]+)/);
    alert("Date: " + matches[2] + " | By: " + matches[1]);
});​

卡罗琳·弗利特伍德 -2012年2月11日 - Something.com

不工作 -2012年2月11日 - Something.com

这是行不通的 -2012年2月11日 - Something.com

$('.review rating')。每个(函数(){ var matches=$(this).text().match(/\s*By\s+([\w.]+)\s*-\s*([\w,]+)/); 警报(“日期:+匹配项[2]+”|由:“+匹配项[1]); });​
在上面,它不会拾取破折号或“By”后面的空格


请看这里jfiddle:

假设行的其余部分是它们的名称,只需从
[\w.]
切换到
[^\r\n]+
,这样它就可以捕捉到下一行之前的其余内容。

答案可能只是使用点匹配器:在默认情况下,它匹配除新行以外的所有内容

.match(/\s*By\s+(.+)\s*-\s*([\w, ]+)/)
唯一需要注意的是,它可能会捕获“By”行上的一些尾随空格(如果有)。一种方法是:

.match(/\s*By\s+(.*\S)\s*-\s*([\w, ]+)/)

这里的
*\S
大致翻译为“匹配以非空格结尾的一个或多个字符,没有新行”。

我知道这很简单,谢谢。我在找“下一行”,这就成功了。又一次打嗝。如果没有“By”这个词,有没有办法为名称返回NULL、zero或任何东西?如果单词“By”不存在(又称为match[2]),我只想提取日期,如果它不包含“By”?将其打包
(?:By\s+)
然后它尝试通过\s+匹配
,否则会忽略它。我注意到这会将日期字段放在匹配中[1]现在请参见此处:稍微更改组以包含匹配:
(?:By\s+([^\r\n]+)|.*)
这会给您一个名称或
未定义的
。那可以接受吗?