正则表达式打破单词而不是匹配整个单词

时间:2015-12-09 11:25:54

标签: javascript regex

我使用下面的函数来链接用户名:

  • 以字母a-z或数字0-9
  • 开头
  • 包含字母a-z,数字0-9和“ - ”
  • 长度为2-50个字符。

function linkifyUsernames(text){
return text.replace(/@\b([0-9a-z-]{2,49})\b/ig, 
"<a href='/profile/$1' target='_blank'>@$1</a>");
}

上面的功能运行正常,但唯一的问题是它会破坏单词。例如,

@abcdéíú

该功能链接单词的第一部分

demo page EIU

但是我需要一个不转换为链接的函数链接任何以@开头但包含除a-z0-9-之外的其他字符的单词。因此, @abcdéíú一词必须保持不变。

由于某些原因,单词键盘无济于事。

3 个答案:

答案 0 :(得分:1)

这不在[0-9a-z]范围之间,尝试此范围[a-z\u00E0-\u00FC],如下例所示:
https://regex101.com/r/vW2mR9/1

答案 1 :(得分:0)

function linkifyUsernames(text) {
  var pattern = /^(@)(\w{2,12})/ig;
  if(text.match(pattern).length>0 && text.match(pattern)[0]=== text)
     return text.replace(pattern, "<a href='/profile/$2' target='_blank'>@$2</a>");
  else return text;
}

$('div').append(linkifyUsernames('@abcd'))
$('div').append('<br/>')
$('div').append(linkifyUsernames('@abcdéáú'))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<div>
</div>

a-z不会涵盖à,é等特殊字符。

您可以使用\w表示法进行简化,例如:

  

/ ^(@)(\ W {2,12})/ IG

这里的例子: https://regex101.com/r/nZ7uI7/1

答案 2 :(得分:0)

如上所述:http://www.regular-expressions.info/wordboundaries.html

  

有三种不同的职位符合词边界:

     
      
  • 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  •   
  • 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  •   
  • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
  •   

如果您尝试使用示例字符串

  

@abcdéíú

仅使用\w来匹配任何单词字符,您会看到déíú不是正则表达字中的单词字符。因此,即使您使用前一个答案中的[a-z\u00E0-\u00FC],正则表达式也因\b而失败。