【问题标题】:Use regex to match emojis as well as text in string使用正则表达式匹配表情符号以及字符串中的文本
【发布时间】:2016-09-26 19:43:31
【问题描述】:

我正在尝试查找字符串的特定子字符串的范围。每个子字符串都以标签开头,并且可以在其中包含任何它喜欢的字符(包括表情符号)。应在不同的范围内检测到重复的主题标签。一位来自这里的好心用户建议了此代码:

var str = "The range of #hashtag should be different to this #hashtag"
let regex = try NSRegularExpression(pattern: "(#[A-Za-z0-9]*)", options: [])
let matches = regex.matchesInString(str, options:[], range:NSMakeRange(0, str.characters.count))
for match in matches {
    print("match = \(match.range)")
}

但是,此代码不适用于表情符号。包含表情符号的正则表达式是什么?有没有办法检测#,后跟任何字符,直到空格/换行符?

【问题讨论】:

    标签: ios regex swift


    【解决方案1】:

    类似于Swift extract regex matches, 您必须将 NSRange 传递给匹配函数,并且 返回的范围也是NSRanges。这可以实现 通过将给定文本转换为NSString

    #\S+ 模式匹配 # 后跟一个或多个 非空白字符。

    let text = "The ?range of #hashtag? should ? be ?? different to this #hashtag?"
    
    let nsText = text as NSString
    let regex = try NSRegularExpression(pattern: "#\\S+", options: [])
    for match in regex.matchesInString(text, options: [], range: NSRange(location: 0, length: nsText.length)) {
        print(match.range)
        print(nsText.substringWithRange(match.range))
    }
    

    输出:

    (15,10) #标签? (62,10) #标签?

    您还可以在NSRangeRange&lt;String.Index&gt; 之间进行转换 使用NSRange to Range<String.Index>中的方法。

    备注: 正如@WiktorStribiżew 正确注意到的那样,上述模式 将包括尾随标点符号(逗号、句号等)。如果 那是不希望的

    let regex = try NSRegularExpression(pattern: "#[^[:punct:][:space:]]+", options: [])
    

    将是一个替代方案。

    【讨论】:

    • 请注意,#\\S+ 也会匹配标签末尾的标点符号。
    • @WiktorStribiżew:你是对的,但问题是关于如何“检测#,后跟任何字符,直到空格/换行符”,并且 OP 声明主题标签可以包含任意个字符。
    • 实际上,将它作为一个主题标签,后跟只有字母、数字和表情符号可能是个好主意……对于加分,你能给出适合那个的正则表达式吗?跨度>
    • @Tometoyou:如果您搜索“正则表达式表情符号”,那么您应该找到一些方法,我没有立即解决方案,而且表情符号字符集随着每个 Unicode 版本而增长。 – 我已经用一个不包括标点符号的更简单的解决方案更新了答案。
    • @Tometoyou:表情符号在NSString 中算作两个字符,这就是NSRange 所指的内容。您可以使用我链接到的stackoverflow.com/a/30404532/1187415 处的rangeFromNSRange 方法将NSRange 转换回Swift String 范围。
    猜你喜欢
    • 1970-01-01
    • 2013-01-09
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多