2015-11-26 23 views
0

我发现了很多正则表达式的例子来从文本中检索hashtags。不幸的是,没有任何例子是我需要的。hashtags的正则表达式

这几乎是我所需要的,但...

function hashtags(text) { 
return text.replace(/(^|\s)#(\w*[a-zA-Z]+\w{2,50})/g, 
"$1<a href='/h/$2' target='_blank'>#$2</a>"); 
} 

#标签不能以数字开头,以避免情况下,当例如第12号得到hashtaged。

上面的例子检查它,但它不允许像ÁÉÍÚ这样的字符,它不正确地检查标签长度并且不允许字符' - '。

所以,我需要如下:

  1. #标签可与任何字母开头 - A,Z,B,N,O,U等,但不能以数字,而不是用特殊标记&%$或 - _

  2. 标签总长度必须为3-50个字符。正则表达式必须接受只有完整单词的标签,但不能在第一个50个字符后剪切它们。因此,以#开头但包含超过50个字符的单词必须被忽略,而不是将前50个字符转换为hashtag链接。在我的示例{2,50}不能正确工作。

  3. 标签的其余部分(当选中它不以数字或特殊标志开头时)可能包含数字,任何字母和_ -标志。 \w只允许_但不-

这可能吗?

+0

你有简单的测试输入吗? –

+0

我认为你可以适应[这个解决方案](http://stackoverflow.com/a/31115742/3832970)。 –

回答

0

试试这个:

/(^|\s)#([^\d&%$_-]\S{2,49})\b/g 

解释:

(^|\s)   # 
#([^\d&%$_-]  # not the characters you mentioned in the first position 
\S{2,49})  # the first chracter was already matched 
\b    # a boundary to avoid overflow 50 characters 

希望它能帮助。

0

对于1 - 你需要一个角色类。你可以用方括号来定义这些。 PCRE定义了\w,但也包括数字。

对于2 - 您可以有一个单词,后跟'某些空格'(PCRE:\s),或者使用环视模式(?![A-Z0-9]) - “没有跟着这个。

而对于3 - 非空白可能是你想要的 - \S PCRE的定义。

/(?<!\w)#[A-Z]\S{1,49}(?!\w)/i 

Demo

编辑:鉴于这可能是特定的JavaScript,而不能使用回顾后,则上述可能不适合你的工作。如果您将我们的正则表达式查询绑定到特定语言,那么在问题中指定该约束将很有用。

+0

'在这种情况下可以用于标记原始问题中的特定语言。 – Sobrique

相关问题