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

Ios Swift-替换字符串中的多个未知字符,ios,swift,Ios,Swift,我希望在Swift中运行一个快速函数来更改字符串的某些方面 目标:获取输入字符串[UITextField],并将所有标点符号替换为空格(.)或(?),仅标点符号本身位于字符串中 问题:我不知道标点符号是什么。有一个UITextField供用户输入。此文本字段也用于其他函数 示例: 输入:你好,你好吗?我很好。非常感谢。 输出:你好,你好吗?我很好。谢谢 测试代码:如果您想在浏览器中测试,我还有一个(JSFIDLE for Swift) var inputText = "hello, how ar

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

目标:获取输入字符串[UITextField],并将所有标点符号替换为空格(.)或(?),仅标点符号本身位于字符串中

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

示例: 输入:你好,你好吗?我很好。非常感谢。 输出:你好,你好吗?我很好。谢谢

测试代码:如果您想在浏览器中测试,我还有一个(JSFIDLE 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)
如果有什么不合理的地方,请告诉我

谢谢你的帮助。 Eric

这可以(例如)通过
NSScanner
实现。以下 代码应该是自我解释的:)

这可以(例如)通过
NSScanner
实现。以下 代码应该是自我解释的:)


您应该能够使用NSRegularExpression和类似的方法
替换匹配安装:选项:范围:带模板:

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

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

编辑: 我决定将此作为一次学习经验,以进一步了解正则表达式

我发现这是对正则表达式的一个不错的介绍

然后,我阅读了NSRegularExpression上的文档,特别是
stringbyreplacingmatcheinstall
函数。也就是说,字符串是基于“模板”替换的

正则表达式的各个部分似乎可以划分为“捕获组”,或单独匹配的部分。然后,您可以使用这些捕获组将匹配字符串的一部分用于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")
}
显然,您是通过将正则表达式的一部分括在括号中来创建捕获组的。所以我定义了一个包含两个捕获组的正则表达式。第一个捕获组是“字符类”,表示任何标点符号:
,.:。正则表达式的这一部分如下所示:(
[,.:;?!])

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

在调用
stringbyreplacingmatcheinstall
时,正则表达式是
([,.:;?!])(\\s*)
,模板字符串是“$1”

这意味着:

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

用捕获组1(标点符号)的内容替换每个匹配项


这样做的效果是从捕获组2中丢弃空白,从而除去指定标点符号后的空白。

您应该能够使用NSRegularExpression和类似的方法
替换匹配安装:选项:范围:带模板:

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

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

编辑: 我决定将此作为一次学习经验,以进一步了解正则表达式

我发现这是对正则表达式的一个不错的介绍

然后,我阅读了NSRegularExpression上的文档,特别是
stringbyreplacingmatcheinstall
函数。也就是说,字符串是基于“模板”替换的

正则表达式的各个部分似乎可以划分为“捕获组”,或单独匹配的部分。然后,您可以使用这些捕获组将匹配字符串的一部分用于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")
}
显然,您是通过将正则表达式的一部分括在括号中来创建捕获组的。所以我定义了一个包含两个捕获组的正则表达式。第一个捕获组是“字符类”,表示任何标点符号:
,.:。正则表达式的这一部分如下所示:(
[,.:;?!])

第二个捕获组匹配任意数量的空白字符。那个
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)