Swift - 使用正则表达式拆分字符串 - 忽略搜索字符串
Swift - Splitting strings with regex - ignoring search string
这里给出了一个聪明的第一个答案,用于使用正则表达式 swift 拆分字符串
但是它会将搜索到的文本保留在答案数组中。我正在尝试做类似的事情,但忽略了充当分隔符的字符(例如,就像 swift split 函数一样,但只是使用正则表达式作为分隔符)。
例如:正则表达式类似于
"\\||Z|ZY"
当应用于 "hi|thisZshouldZYbe|separated"
的字符串时,您将得到一个数组
["hi", "this", "should", "be", "separated"]
注意。正则表达式适用于具有双重转义的 swift NSRegularExpression 格式。在常规正则表达式中,它只是 "\||Z|ZY"
另外注意,正则表达式包含垂直线符号而不是字母 "l"
您可能不需要对原件进行太多调整即可完成工作。
您可以这样定义扩展名:
extension String {
func split(usingRegex pattern: String) -> [String] {
//### Crashes when you pass invalid `pattern`
let regex = try! NSRegularExpression(pattern: pattern)
let matches = regex.matches(in: self, range: NSRange(0..<utf16.count))
let ranges = [startIndex..<startIndex] + matches.map{Range([=10=].range, in: self)!} + [endIndex..<endIndex]
return (0...matches.count).map {String(self[ranges[[=10=]].upperBound..<ranges[[=10=]+1].lowerBound])}
}
}
let str = "hi|thisZshouldZYbe|separated"
let separator = "\||ZY?"
let result = str.split(usingRegex: separator)
print(result) //->["hi", "this", "should", "be", "separated"]
当您使用 "\||Z|ZY"
时,上面的代码并不像您预期的那样工作,但我认为您可以修改您的模式以适应此扩展。
我的建议是创建一个 UUID 字符串作为分隔符,然后用这个 UUID 字符串替换出现的正则表达式模式并拆分字符串。
let string = "hi|thisZshouldZYbe|separated"
let uuid = UUID().uuidString
let result = string.replacingOccurrences(of: "\||ZY?", with: uuid, options: .regularExpression).components(separatedBy: uuid)
您的模式仅适用于 OR 部分的另一个顺序 ("\||ZY|Z"
)
这里给出了一个聪明的第一个答案,用于使用正则表达式 swift 拆分字符串
但是它会将搜索到的文本保留在答案数组中。我正在尝试做类似的事情,但忽略了充当分隔符的字符(例如,就像 swift split 函数一样,但只是使用正则表达式作为分隔符)。
例如:正则表达式类似于
"\\||Z|ZY"
当应用于 "hi|thisZshouldZYbe|separated"
的字符串时,您将得到一个数组
["hi", "this", "should", "be", "separated"]
注意。正则表达式适用于具有双重转义的 swift NSRegularExpression 格式。在常规正则表达式中,它只是 "\||Z|ZY" 另外注意,正则表达式包含垂直线符号而不是字母 "l"
您可能不需要对原件进行太多调整即可完成工作。
您可以这样定义扩展名:
extension String {
func split(usingRegex pattern: String) -> [String] {
//### Crashes when you pass invalid `pattern`
let regex = try! NSRegularExpression(pattern: pattern)
let matches = regex.matches(in: self, range: NSRange(0..<utf16.count))
let ranges = [startIndex..<startIndex] + matches.map{Range([=10=].range, in: self)!} + [endIndex..<endIndex]
return (0...matches.count).map {String(self[ranges[[=10=]].upperBound..<ranges[[=10=]+1].lowerBound])}
}
}
let str = "hi|thisZshouldZYbe|separated"
let separator = "\||ZY?"
let result = str.split(usingRegex: separator)
print(result) //->["hi", "this", "should", "be", "separated"]
当您使用 "\||Z|ZY"
时,上面的代码并不像您预期的那样工作,但我认为您可以修改您的模式以适应此扩展。
我的建议是创建一个 UUID 字符串作为分隔符,然后用这个 UUID 字符串替换出现的正则表达式模式并拆分字符串。
let string = "hi|thisZshouldZYbe|separated"
let uuid = UUID().uuidString
let result = string.replacingOccurrences(of: "\||ZY?", with: uuid, options: .regularExpression).components(separatedBy: uuid)
您的模式仅适用于 OR 部分的另一个顺序 ("\||ZY|Z"
)