在Swift中,如何删除字符串中的哈希标记?

在Swift中,如何删除字符串中的哈希标记?,swift,Swift,例如,string=我是一个#hashtag1 string#hashtag2 Hi 在Swift 2中,删除hashtags使字符串变为I am string Hi的理想方法是什么 哈希标记不是固定字符串。它可以是任何以#开头的字符串。此问题不应标记为重复。带有正则表达式的解决方案 let string = "I am a #hashtag1 string #hashtag2 Hi!" let withoutHashTags = string.stringByReplacingOccurren

例如,string=
我是一个#hashtag1 string#hashtag2 Hi

在Swift 2中,删除hashtags使字符串变为
I am string Hi的理想方法是什么


哈希标记不是固定字符串。它可以是任何以
#
开头的字符串。此问题不应标记为重复。

带有正则表达式的解决方案

let string = "I am a #hashtag1 string #hashtag2 Hi!"
let withoutHashTags = string.stringByReplacingOccurrencesOfString("#(?:\\S+)\\s?", 
                             withString: "", 
                                options: .RegularExpressionSearch, 
                                  range: Range(string.startIndex..<string.endIndex))
let string=“我是一个#hashtag1 string#hashtag2 Hi!”
let withoutHashTags=string.StringByReplacingOfString(“#(?:\\S+\\S?”)的出现,
带字符串:“”,
选项:。常规表达式搜索,

range:range(string.startIndex..带正则表达式的解决方案

let string = "I am a #hashtag1 string #hashtag2 Hi!"
let withoutHashTags = string.stringByReplacingOccurrencesOfString("#(?:\\S+)\\s?", 
                             withString: "", 
                                options: .RegularExpressionSearch, 
                                  range: Range(string.startIndex..<string.endIndex))
let string=“我是一个#hashtag1 string#hashtag2 Hi!”
let withoutHashTags=string.StringByReplacingOfString(“#(?:\\S+\\S?”)的出现,
带字符串:“”,
选项:。常规表达式搜索,

范围:范围(string.startIndex..或使用
reduce
,但失去可读性:

let testString = "I am a #hashtag1 string .#hashtag2 Hi!"

let reducedValue = testString.characters.reduce(("", true)) {

    if $0.1 && $1 != "#" {
        return ("\($0.0)\($1)", true)
    } else if $0.1 && $1 == "#" {
        return ("\($0.0)", false)
    } else if let last = $0.0.characters.last where !$0.1 && $1 == " " && last == " " {
        return ("\($0.0)", true)
    } else if !$0.1 && $1 == " " {
        return ("\($0.0)\($1)", true)
    } else {
        return ("\($0.0)", false)
    }

let result = reducedValue.0

或者使用
减少
,但失去可读性:

let testString = "I am a #hashtag1 string .#hashtag2 Hi!"

let reducedValue = testString.characters.reduce(("", true)) {

    if $0.1 && $1 != "#" {
        return ("\($0.0)\($1)", true)
    } else if $0.1 && $1 == "#" {
        return ("\($0.0)", false)
    } else if let last = $0.0.characters.last where !$0.1 && $1 == " " && last == " " {
        return ("\($0.0)", true)
    } else if !$0.1 && $1 == " " {
        return ("\($0.0)\($1)", true)
    } else {
        return ("\($0.0)", false)
    }

let result = reducedValue.0
Oneliner:

let text = "I am a #hashtag1 string #hashtag2 Hi!"
let test = text.componentsSeparatedByString(" ").filter { !$0.containsString("#hashtag") }.joinWithSeparator(" ")

print(test) // I am a string Hi!
编辑:

返回到oneliner:p,但对我的口味来说仍然有点太复杂。

oneliner:

let text = "I am a #hashtag1 string #hashtag2 Hi!"
let test = text.componentsSeparatedByString(" ").filter { !$0.containsString("#hashtag") }.joinWithSeparator(" ")

print(test) // I am a string Hi!
编辑:


返回一行代码:p,对我来说仍然有点太复杂。

您可以使用以下语句:

让aString=“我是一个#hashtag1字符串。#hashtag2嗨!”


让newString=aString.replacingOccurrences(of:“#hashtag”,with:”)

您可以使用以下语句:

让aString=“我是一个#hashtag1字符串。#hashtag2嗨!”


让newString=aString.replacingOccurrences(of:“#hashtag”,with:”)

获取字符串数组(使用ComponentSeparatedByString)用空格分隔,然后检查以#开头的每个字符串,如果是,则删除它们,然后再次重建字符串sentence@azimov谢谢。这是我想到的一种方法,但我希望学习更多的方法(如果有的话)。获取字符串数组(使用ComponentSeparatedByString)用空格分隔,然后检查以#开头的每个字符串,如果是,则删除它们,然后再次重建字符串sentence@azimov谢谢。这是我想到的一种方法,但我希望能学到更多的方法(如果有的话)。非常简洁。作为
String
mutating func removeHashTags(){…}的变异扩展,可能很有用
只需添加上面的
string
替换为
self
。这里唯一可能的缺点是,如果hashtag与前面的单词没有很好地分开,那么我们将把前面的单词粘到hashtag单词后面的单词上,例如
“我被粘到了hashtag1 ThisNow上了#hashtag2 Hi!”
产生
“我被粘住了!嗨!”
。你可以用这个正则表达式
\\s?#(?:\\s+)\\s?
来做这件事,并替换为一个空格字符而不是空字符串@dfrith将修复“粘住”效果,但如果说第一个或最后一个单词是一个哈希标记词,仍然会留下额外的空格。例如,
“#哈希标记1 2#哈希标记2三#哈希标记3#哈希标记3”“
产生
“一二三四”
。我知道,对于所有情况都没有简单的解决方案。@dfriI更新了答案。去除前导或尾随空格的最简单方法是修剪字符串。非常整洁紧凑。作为
字符串的变异扩展,
mutating func removeHashTags(){…}可能很有用
只需添加上面的
string
替换为
self
。这里唯一可能的缺点是,如果hashtag与前面的单词没有很好地分开,那么我们将把前面的单词粘到hashtag单词后面的单词上,例如
“我被粘到了hashtag1 ThisNow上了#hashtag2 Hi!”
产生
“我被粘住了!嗨!”
。你可以用这个正则表达式
\\s?#(?:\\s+)\\s?
来做这件事,并替换为一个空格字符而不是空字符串@dfrith将修复“粘住”效果,但如果说第一个或最后一个单词是一个哈希标记词,仍然会留下额外的空格。例如,
“#哈希标记1 2#哈希标记2三#哈希标记3#哈希标记3”“
产生
“一二三四”
。我知道,对于所有情况都没有简单的解决方案。@dfriI更新了答案。去除前导空格或尾随空格的最简单方法是修剪字符串。此解决方案也适用于OP:s问题中的示例,但请注意,它有与vadian:s答案中所述相同的缺点:如果标签字没有很好地分开从前面的单词开始,前面的单词将被粘贴到标签后面的单词中。@dfri是的,我更新了我的答案,稍作修改,以消除“粘合效应”。这解决了这个问题,但现在是“正常”has标记将被替换,留下两个空格。此外,如果hashtag是字符串中的最后一个字,则解决方案仍会留下一个尾随空格(如果hashtag是第一个字,则会留下一个额外的空格)。例如,
let testString=“#hashtag1一两#hashtag2三#hashtag3四#hashtag3”
产生
|一二三四
(对于
打印(“|”+结果+“|”):请注意额外的首字母和尾随空格,最后是
3`和
4
之间的额外空格。此解决方案也适用于OP:s问题中的示例,但请注意,它具有与vadian:s答案中所述相同的缺点:如果标签字与其前面的字没有很好地分开,则前面的word将粘在标签后面的单词中。@dfri是的,为了消除“粘合效应”,我对答案进行了轻微的修改。这解决了这个问题,但现在“正常”has标签将被替换,留下两个空格。此外,如果标签是字符串中的最后一个单词,解决方案仍然会留下一个尾随空格(如果是ha,还需要额外的空间)