Swift - 替换字符串

时间:2015-05-13 14:20:34

标签: ios swift

我希望在 Swift 中运行一个快速功能来更改字符串的某些方面。

目标:获取输入字符串[UITextField]并替换所有标点符号,后跟空格(。)或(?),只是标点符号本身就在字符串中

问题:我不知道标点符号是什么。有一个UITextField供用户输入。这个文本字段也用于其他功能。

示例: 输入:你好,你好吗?我做得很好。谢谢。 输出:你好,你好吗?我做得很好。谢谢你。

测试代码:如果您想在浏览器中测试,我还有一个Swift Stub(JSFiddle for Swift)。

var inputText = "hello, how are you doing? I am okay. Thanks." // User input from UITextField

var newString: String! // Setting string for global variable

var punctuation: String = "" // Starts as blank, could remain empty
punctuation = "?.," // Dont know what this will be. Input from UITextField

var characters = Array(punctuation)
println(characters) //Testing in console 

//Current idea but does not work as needed
func replacePunctuationSpace() -> String{

    for character in characters{
        newString = inputText.stringByReplacingOccurrencesOfString("\(character) ", withString: "\(character)")
        println("Replacing \(character)  ... \(newString)")   
    }
    return newString

}
replacePunctuationSpace()

//Only replaces last item in array
println(newString)

如果没有意义,请告诉我。

感谢您的帮助。 埃里克

3 个答案:

答案 0 :(得分:3)

您应该可以使用NSRegularExpression和类似的方法 replaceMatchesInString:options:range:withTemplate:

我不是正则表达式的专家。我相信你可以使你的正则表达式有2个“捕获组”,其中第一个捕获组是可能的标点字符列表,第二个是可变数量的空格。你的模板会告诉`replaceMatchesInString:options:range:withTemplate:function将每个匹配的表达式替换为第一个捕获组的内容(匹配的标点符号)。

您需要列出您要处理的所有标点符号(例如“。,:?!;”)

编辑:

我决定将此作为学习经验,以了解有关正则表达式的更多信息。

我发现this page是正则表达式的一个不错的介绍。

然后我阅读了有关NSRegularExpression的文档,特别是stringByReplacingMatchesInString函数。这表示根据“模板”替换字符串。

似乎正则表达式的各个部分可以分为“捕获组”或分别匹配的部分。然后,您可以使用这些捕获组将匹配字符串的一部分用于stringByReplacingMatchesInString的输出。

以下是我编写的一些游戏代码,用于搜索标点字符“,。:;?!”接着是一个或多个空白字符,只用标点符号替换它们,剥去空白:

var error: NSError?
let myRegEx = NSRegularExpression(pattern: "([,.:;?!])(\\s*)",
  options: NSRegularExpressionOptions(0),
  error: &error)

let testString = "This is a string, with some text.   It has punctuation; can we replace that punctuation? I need to know what happens! "
let range = NSRange(location: 0, length: count(testString))
println(testString)
if let newString = myRegEx?.stringByReplacingMatchesInString(
  testString,
  options: NSMatchingOptions(0),
  range: range,
  withTemplate: "$1")
{
  println("Result string = \(newString)")
}
else
{
  println("No matches")
}

显然,您可以通过将正则表达式的一部分括在括号中来创建捕获组。所以我用2个捕获组定义了一个正则表达式。第一个捕获组是“字符类”,表示任何标点符号:,.:;?!。正则表达式的那一部分如下所示:([,.:;?!])

第二个捕获组匹配任意数量的空白字符。空格的特殊“字符类”是\s。但是,Swift字符串也使用反斜杠进行转义,因此为了在正则表达式中获得字面反斜杠,我必须将其写为\\s。将其放在括号中会将其转换为捕获组:(\\s)

在对stringByReplacingMatchesInString的调用中,正则表达式为([,.:;?!])(\\s*),模板字符串为“$ 1”。

这意味着:

匹配由标点字符后跟零个或多个空格字符组成的字符串。将每个匹配的标点字符放在“捕获组”1中,并将捕获组2中的空格“。

将每个匹配替换为捕获组1的内容,即标点字符。

具有从捕获组2中丢弃空白的效果,从而在指定的标点符号后删除空格。

答案 1 :(得分:2)

这可以(例如)使用NSScanner来实现。下列 代码应该是自我解释的:)

let inputText = "hello, how are you doing? I am okay. Thanks."
var outputText = ""

let punkt = NSCharacterSet.punctuationCharacterSet()
let space = NSCharacterSet.whitespaceCharacterSet()

let scanner = NSScanner(string: inputText)
while !scanner.atEnd {
    var tmp : NSString?
    if scanner.scanUpToCharactersFromSet(punkt, intoString: &tmp) {
        outputText += tmp as! String
        if scanner.scanCharactersFromSet(punkt, intoString: &tmp) {
            outputText += tmp as! String
            scanner.scanCharactersFromSet(space, intoString: nil)
        }
    }
}

println(outputText)
// hello,how are you doing?I am okay.Thanks.

答案 2 :(得分:1)

免责声明:我从未写过Swift

问题是您只需要修改inputText变量。循环的每次迭代都会从原始输入文本开始。

尝试这样的事情:

var inputText = "hello, how are you doing? I am okay. Thanks." // User input from UITextField

var newString: String! // Setting string for global variable

var punctuation: String = "" // Starts as blank, could remain empty
punctuation = "?.," // Dont know what this will be. Input from UITextField

var characters = Array(punctuation)
println(characters) //Testing in console 

//Current idea but does not work as needed
func replacePunctuationSpace() -> String {
    newString = inputText
    for character in characters{
        newString = newString.stringByReplacingOccurrencesOfString("\(character) ", withString: "\(character)")
        println("Replacing \(character)  ... \(newString)")   
    }
    return newString
}
replacePunctuationSpace()

//Only replaces last item in array
println(newString)

http://swiftstub.com/716967254/