【问题标题】:javascript Regex trim up to 'space' AND 'dash' or matchjavascript 正则表达式修剪到“空格”和“破折号”或匹配
【发布时间】:2012-02-29 02:31:52
【问题描述】:

我之前问过一个类似的问题,得到了正确的回答。不过这次我宁愿尝试分别在“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]);
});​

上面的它不会在“By”之后拾取破折号或空格。

请看这里 jfiddle:http://jsfiddle.net/GYSbR/1/

【问题讨论】:

    标签: javascript regex match trim


    【解决方案1】:

    假设该行的其余部分是他们的名字,只需从 [\w.] 切换到 [^\r\n]+,这样它就会捕获其余内容,直到下一个新行。

    【讨论】:

    • 我知道这很简单,谢谢。正在寻找“到下一行”,它做到了。
    • 又一个小问题。如果没有“By”这个词,有没有办法返回 NULL 或零或任何名称?如果“By”一词不存在(又名 match[2]),如果它不包含“By”,我只想提取日期?
    • 把它打包成一个组? (?:By\s+)? 然后它会尝试匹配 By\s+ 如果它在那里,否则忽略它。
    • 我注意到这会将日期字段放入 match[1] 现在请参见此处:jsfiddle.net/GYSbR/25
    • 稍微更改组以包含匹配项:(?:By\s+([^\r\n]+)|.*?) 这将为您提供名称或undefined。这可以接受吗?
    【解决方案2】:

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

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

    唯一需要注意的是,如果有的话,它可能会在“By”行捕获一些尾随空格。一种解决方法:

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多