无论特殊字符如何,Javascript正则表达式都匹配最后一个单词

时间:2013-06-12 15:15:37

标签: javascript regex

我们使用此脚本来改变句子中的最后一个单词。

$div = $('.cPageHeader h2');
$div.html($div.text().replace(/(\w+?)$/, '<span class="cOrange">$1</span>'));

只要不涉及特殊字符,这种方法效果很好。

只要我们有像<h2>International fancy stüff</h2>这样的标题,突出显示就会出错。只有ff会突出显示。如果我们在行(!-.?)的末尾有一个字符,则会发生同样的错误。

有人可以更改脚本,以便突出显示最后一个字(包括附加的标点符号)和任何重音字符吗?

2 个答案:

答案 0 :(得分:2)

我建议:

$div = $('.cPageHeader h2');
$div.html($div.text().replace(/(\S+?)$/, '<span class="cOrange">$1</span>'));

JS Fiddle demo

这基本上会查找字符串末尾的所有非空白字符,但如果你的字符串结尾,则不会有突出显示(因此可能值得首先修剪字符串 ,只是为了确定。

以下内容复制了上述内容,但对尾随空格更加宽容:

var $div = $('#demo');
$div.html($div.text().replace(/\b(\S+?)(\b|(?:\s+))$/, '<span class="cOrange">$1</span>'));

JS Fiddle demo

匹配:

  • \b:字边界;
  • \S+:一个或多个非空格字符的序列;
  • (\b|(?:\s+)):另一个字边界一个或多个空白字符的序列。

再次更新,因为原始表达式中的编号匹配($1)显然已被弃用,或者很快就会被弃用(尽管我无法找到备份的引用特别的回忆,所以也许拿一小撮盐,并改为使用函数:

var $div = $('#demo');
$div.html($div.text().replace(/\b(\S+?)(\b|(?:\s+))$/, function(a){
    return '<span class="cOrange">' + a + '</span>';
}));

JS Fiddle demo

参考文献:

答案 1 :(得分:1)

这应该是你所需要的:

$div.text().replace(/(\S+)$/, '<span class="cOrange">$1</span>')

您希望在匹配中包含尾随标点符号,因此\w+永远不是正确的工具。通过这种方式,您无需处理将ü等非ASCII字符视为单词字符。

仅供参考,使用像\S+?这样不情愿的量词是没有意义的,因为你一直匹配到字符串的结尾。在这种情况下,这不是不正确的,只是毫无意义。