正则表达式,用于匹配与字符串中的第一个单词不匹配'hashtagged'单词



我使用以下正则表达式尝试匹配给定字符串中所有'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+)

http://www.regexr.com/39alk

最新更新