使用正则expression式匹配emojis以及string中的文本

我正在试图find一个string的特定子string的范围。 每个子string都以hashtag开头,可以包含任何喜欢的字符(包括emojis)。 应该在不同的范围内检测重复的主题标签。 来自这里的一位善良的用户build议这个代码

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)") } 

但是,这个代码不适用于emojis。 包括emojis在内的正则expression式是什么? 有没有办法检测# ,然后是任何字符,直到空格/换行符?

同样在Swift中提取正则expression式匹配 ,你必须传递NSRange到匹配函数,返回的范围也是NSRange 。 这可以通过将给定的文本转换为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)
 #hashtag🐶
 (62,10)
 #hashtag🐮

你也可以使用从NSRange到Range <String.Index>的方法在NSRangeRange<String.Index>之间NSRange转换。

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

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

将是一个替代scheme。