【问题标题】:How to get hashtag from string that contains # at the beginning and end without space at the end?如何从包含#开头和结尾没有空格的字符串中获取主题标签?
【发布时间】:2018-11-16 20:57:57
【问题描述】:
这是我的字符串
"I made this wonderful pic last #chRistmas... #instagram #nofilter #snow #fun"
并且我想获得在开头和结尾都包含 # 且没有空格的主题标签。我的预期结果是:
$fun
这是我迄今为止的正则表达式搜索:
#[a-z0-9]+
但它给了我所有标签,而不是我想要的标签。感谢您的帮助!
【问题讨论】:
标签:
swift
regex
nsregularexpression
【解决方案1】:
使用#[a-zA-Z0-9]*$ 代替您当前的正则表达式
【解决方案2】:
您可以使用:
(^#[a-z0-9]+|#[a-z0-9]+$)
测试一下online
【解决方案3】:
您似乎需要匹配字符串末尾的主题标签,或字符串中的最后一个主题标签。所以,有几种方法可以解决这个问题。
匹配字符串中的最后一个标签
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+ 个字母或/和数字。
请注意,在 ICU 正则表达式模式中,您可以将 [[:alnum:]] 写为 [:alnum:]。