使用与jquery匹配,但将连字符视为单词的一部分

时间:2017-01-31 05:44:59

标签: jquery

我的字符串See Good-by

我有这个匹配字符串

中的所有单词
var result = $(this).text().match(/\b(\w+)\b/gi);

但它认为-不是这个词的一部分。只要连字符和它旁边的单词之间没有空格,是否可以将连字符视为单词的一部分?

这是我的完整代码

$('.definition').each( function(p) {
    var c = '';
    var result = $(this).text().match(/\b[\w-]+\b/g);
    $.each(result, function(i) {
        if (result[i] != '') {
            if ($.inArray(result[i].toLowerCase(), stopwords) === -1) {
                var link = ' <a href="/dictionary/word/' + result[i].toLowerCase() + '/">' + result[i] + '</a>';
                c += link;
            } else {
                c += " "+result[i];
            }
        }
    })
    $(this).html(c);
})

解决

我有一个我需要检查的数组中的停用词列表,因此它们不包含在链接中。这是工作代码,谢谢@Pranav C Balan

$('.definition').html(function() {
    return $(this).text().replace(/\b[\w-]+\b/g, function(m){
        if ($.inArray(m.toLowerCase(), stopwords) === -1) {
            return ' <a href="/dictionary/word/' + m.toLowerCase() + '/">' + m + '</a>';
        } else {
            return " "+m;
        }
    });
})

1 个答案:

答案 0 :(得分:1)

您可以使用character class-与字符组合。虽然此处i标志完全没有必要,因为\w包括小写和大写字母。

var result = $(this).text().match(/\b[\w-]+\b/g);

&#13;
&#13;
console.log(
  'See Good-by'.match(/\b[\w-]+\b/g)
)
&#13;
&#13;
&#13;

更新1:我认为您在更新的代码中过度复杂化了问题。不是获取匹配的字符串并生成字符串,而是使用带有回调的String#replace方法生成字符串。

$('.definition').each(function() {
  var result = $(this).text().replace(/\b[\w-]+\b/g, function(m){
    return ' <a href="/dictionary/word/' + m.toLowerCase() + '/">' + m + '</a>';
  });
  // or
  // return $(this).text().replace(/\b[\w-]+\b/g, ' <a href="/dictionary/word/$&/">$&</a>');  
  $(this).html(result);
})

您甚至可以使用html()方法使用回调来减少上述代码,该回调在元素内部进行迭代。

$('.definition').html(function() {
  return $(this).text().replace(/\b[\w-]+\b/g, function(m){
    return ' <a href="/dictionary/word/' + m.toLowerCase() + '/">' + m + '</a>';
  });
  // or
  // return $(this).text().replace(/\b[\w-]+\b/g, ' <a href="/dictionary/word/$&/">$&</a>');
})

更新2 :为避免代码中出现stopwords,请使用替换回调中的逻辑。

$('.definition').html(function() {
  return $(this).text().replace(/\b[\w-]+\b/g, function(m){
    return $.inArray(result[i].toLowerCase(), stopwords) === -1 ? ' <a href="/dictionary/word/' + m.toLowerCase() + '/">' + m + '</a>' : m;
  });
})

或在negative lookahead assertion的帮助下将其与正则表达式一起使用。

$('.definition').html(function() {
  return $(this).text().replace(new RegExp('(?!(?:' + stopwords.join('|') + ')\\b)\\b[\\w-]+\\b', 'g'), function(m){
    return ' <a href="/dictionary/word/' + m.toLowerCase() + '/">';
  });
})