我希望在 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)
如果没有意义,请告诉我。
感谢您的帮助。 埃里克
答案 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)