gpt4 book ai didi

ios - Swift - 替换字符串中的多个未知字符

转载 作者:行者123 更新时间:2023-11-28 09:46:23 24 4
gpt4 key购买 nike

我希望在 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)

如果有什么不对请告诉我。

感谢您的帮助。埃里克

最佳答案

你应该能够使用 NSRegularExpression 和类似的方法replaceMatchesInString:options:range:withTemplate:.

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

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

编辑:

我决定以此为学习经验,进一步了解正则表达式。

我找到了 this page这是对正则表达式的不错介绍。

然后我阅读了有关 NSRegularExpression 的文档,尤其是 stringByReplacingMatchesInString 函数。也就是说,字符串是根据"template"替换的。

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

这是我编写的一些 Playground 代码,用于搜索标点符号“,.:;?!”后跟一个或多个空白字符,并仅用标点符号替换它们,去除空白:

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 中丢弃空白的效果,从而消除了指定标点符号后的空白。

关于ios - Swift - 替换字符串中的多个未知字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30217649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com