gpt4 book ai didi

regex - swift 2 : How do I split a string without loosing the characters it split on?

转载 作者:行者123 更新时间:2023-11-28 06:51:27 24 4
gpt4 key购买 nike

假设我有字符串 "a:b:c" 我如何拆分它以便我最终得到数组 ["a", ":", "b", ":", "c"]?

我的最终目标是我可以为我想要的任何定界符(不仅仅是“:”)传递正则表达式的方法,但我无法弄清楚如何在 Swift 2 中拆分字符串而不丢失它拆分的字符。

[edit] 澄清(基于评论)我不是要按字符拆分它,我也不是要专门按“:”拆分。这只是一个随机分隔符,我认为它会提供一个简单的例子。我想知道如何在正则表达式中定义的任何随机定界符上拆分字符串并且不丢失定界符。 “fooBerry-BazClom*”拆分为 [B\\-*] 会得到我 ["foo", "B", "erry", "-", "B", "az", "Clom", "*"]

最佳答案

我相信这会成功(虽然不确定它是否非常有效):

extension String
{
func componentsStartingFromCharactersInSet(searchSet: NSCharacterSet) -> [String]
{
if self == "" { return [] }

if let firstDelimiter = rangeOfCharacterFromSet(searchSet)
{
let delimiter = self.substringWithRange(firstDelimiter)
var result:[String] = []

if let rightIndex = firstDelimiter.last?.successor()
{ result = self.substringFromIndex(rightIndex).componentsStartingFromCharactersInSet(searchSet) }

result.insert(delimiter, atIndex:0)

if !hasPrefix(delimiter)
{ result.insert(self.substringToIndex(firstDelimiter.first!), atIndex:0) }

return result
}
return [self]
}
}

使用方法如下:

let searchSet = NSCharacterSet(charactersInString:"B\\-*")
"fooBerry-BazClom*".componentsStartingFromCharactersInSet(searchSet)

返回 ["foo", "B", "erry", "-", "B", "azClom", "*"]

鉴于您需要一个正则表达式来表达分隔符,我不确定您的目标是什么,但这是一个基于正则表达式的修改版本(以及一些对范围类型转换的摆弄):

extension String
{
var length:Int {return (self as NSString).length }

func stringRange(range:NSRange) -> Range<String.Index>
{
let start = self.startIndex.advancedBy(range.location)
let end = start.advancedBy(range.length)
return Range<String.Index>(start: start, end: end)
}

func componentsFromRegExp(regExp:String) -> [String]
{
if self == "" { return [] }
do
{
let expression = try NSRegularExpression(pattern: regExp, options: NSRegularExpressionOptions.CaseInsensitive)
return self.componentsFromRegExp(expression)
}
catch { return [self] }
}

func componentsFromRegExp(regExp:NSRegularExpression) -> [String]
{
if self == "" { return [] }

if let firstMatch = regExp.firstMatchInString(self, options:NSMatchingOptions(rawValue:0), range:NSMakeRange(0, self.length) )
where firstMatch.range.length > 0
{
let firstDelimiter = self.stringRange(firstMatch.range)
let delimiter = self.substringWithRange(firstDelimiter)
var result:[String] = []

if let rightIndex = firstDelimiter.last?.successor()
{ result = self.substringFromIndex(rightIndex).componentsFromRegExp(regExp) }

result.insert(delimiter, atIndex:0)

if !hasPrefix(delimiter)
{ result.insert(self.substringToIndex(firstDelimiter.first!), atIndex:0) }

return result
}
return [self]
}
}

我不得不在正则表达式中使用不同的语法来定义分隔符。这就是为什么我不确定我是否完全理解您的需求。

"fooBerry-BazClom*".componentsFromRegExp("B|-|\\*")
// returns ["foo", "B", "erry", "-", "B", "azClom", "*"]

关于regex - swift 2 : How do I split a string without loosing the characters it split on?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34781282/

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