如何从开头和结尾包含#但结尾没有space的字符串中获取主题标签?

How to get hashtag from string that contains # at the beginning and end without space at the end?

这是我的字符串

"I made this wonderful pic last #chRistmas... #instagram #nofilter #snow #fun"

并且我想获得开头和结尾都包含#但没有space的主题标签。我的预期结果是:

$fun

这是我到目前为止的正则表达式搜索:

#[a-z0-9]+

但它给了我所有的标签,而不是我想要的标签。感谢您的帮助!

使用 #[a-zA-Z0-9]*$ 而不是当前的正则表达式

您可以使用: (^#[a-z0-9]+|#[a-z0-9]+$)

测试一下online

您似乎需要匹配字符串末尾的主题标签,或字符串中的最后一个主题标签。所以,有几种方法可以解决这个问题。

匹配字符串中的最后一个主题标签

let str = "I made this wonderful pic last #chRistmas... #instagram #nofilter #snow #fun"
let regex = "#[[:alnum:]]++(?!.*#[[:alnum:]])"
if let range = str.range(of: regex, options: .regularExpression) {
    let text: String = String(str[range])
    print(text)
}

详情

  • # - 哈希符号
  • [[:alnum:]]++ - 1 个或多个字母数字字符
  • (?!.*#[[:alnum:]]) - 没有 # + 1+ 个字母数字字符在任何 0+ 个字符之后,而不是紧邻当前位置右侧的换行符字符。

匹配字符串末尾的主题标签

相同的代码,但具有以下正则表达式:

let regex = "#[[:alnum:]]+$"

let regex = "#[[:alnum:]]+\z"

注意 \z 匹配字符串的末尾,如果主题标签和字符串末尾之间有换行符,则不会有任何匹配(在 $ 的情况下, 会有一场比赛)。

关于正则表达式的注意事项

如果主题标签只应以字母开头,最好使用

#[[:alpha:]][[:alnum:]]*

其中 [[:alpha:]] 匹配任意字母,[[:alnum:]]* 匹配 0+ 个字母 or/and 数字。

请注意,在 ICU 正则表达式模式中,您可以将 [[:alnum:]] 写为 [:alnum:]