我使用以下正则表达式尝试匹配给定字符串中所有'hashtagged'的单词:
/([^a-zA-Z0-9-_&])#([0-9a-zA-Z_]+)/
在下面的字符串中,#rather
, #pointless
和#text
将被成功匹配:
My string: this is some #rather #pointless meaningless #text.
但是,在第一个单词被hashtagged的字符串中,只匹配后面的hashtagged单词(#pointless
和#text
):
My string: #rather #pointless meaningless #text
我如何确保我的字符串的第一个单词也匹配,如果它是hashtagged?
编辑:我在PHP脚本中使用表达式,或者更具体地说,在preg_replace()
函数中,如下所示:
$content = preg_replace( '/#w+/g', "$1<a href="/tags/$2" title="$2">#$2</a>", $content );
您需要的是使用w字符类。不知道你在用什么语言写,但你可以像这样简单地做到:
/(w*)#(w+)/
编辑:更改以上内容,使捕获组适合您的替换字符串
第一部分(在括号之间)要求在散列前面有一些文本。如果它位于字符串的开头,则可以将其设置为可选的:
/(^|[^a-zA-Z0-9-_&])#([0-9a-zA-Z_]+)/
正如一些人建议的那样,您可以避免显式地写出所有匹配的字符(使用组):
/(^|[^w-&])#(w+)/
你的语言/引擎是否支持负向后看?
(?<![w-&])#(w+)