【问题标题】:regex for hashtags标签的正则表达式
【发布时间】:2015-11-26 12:44:32
【问题描述】:

我找到了很多正则表达式示例来从文本中检索主题标签。不幸的是,没有一个例子是我需要的。

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

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 节 被添加主题标签的情况。

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

所以,我需要以下内容:

  1. 主题标签可以以任何字母开头 - A、z、B、Ñ、ó、Ú 等,但不能以数字和特殊符号 &%$ 或 - _

    李>
  2. 主题标签的总长度必须为 3-50 个字符。正则表达式必须只接受完整的单词作为主题标签,但不能在前 50 个字符之后将其剪切。因此,必须忽略以# 开头但包含超过 50 个字符的单词,而不是将前 50 个字符转换为主题标签链接。在我的示例中,{2,50} 无法正常工作。

  3. 主题标签的其余部分(当检查它不是以数字或特殊符号开头时)可能包含数字、任何字母和_ - 符号。 \w 只允许 _ 而不允许 -

有可能吗?

【问题讨论】:

  • 您有简单的测试输入吗?
  • 我觉得你可以适应this solution

标签: regex


【解决方案1】:

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

对于 2 - 您可以有一个单词后跟“一些空格”(PCRE:\s)或使用环顾模式(?![A-Z0-9]) - 表示“后面没有这个。

对于 3 - 非空白可能是您想要的 - PCRE 定义中的\S

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

Demo

编辑:鉴于这可能是特定于javascript的,并且您不能使用lookbehind,那么上面的内容可能不适合您。如果您将我们的正则表达式查询绑定到特定语言,则在问题中指定该约束很有用。

【讨论】:

  • '在这种情况下,在原始问题中标记特定语言会很有用。
【解决方案2】:

试试这个:

/(^|\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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多