如何使用正则表达式将字符串拆分为相同字符组?

3

I got a string like this:

var string = "AAAAAAABBBCCCCCCDD"

我想将字符串按照这种格式(相同字符 --> 相同分组),使用正则表达式拆分为数组:

Array: "AAAAAAA", "BBB", "CCCCCC", "DD"

这是我目前得到的东西,但说实话我无法让它正常工作。


var array = [String]()
var string = "AAAAAAABBBCCCCCCDD"
let pattern = "\\ b([1,][a-z])\\" // mistake?!
let regex = try! NSRegularExpression(pattern: pattern, options: [])

array = regex.matchesInString(string, options: [], range: NSRange(location: 0, length: string.count))

请注意,将 string.count 传递给 NSRange 是错误的,对于包含“扩展字形集群”的字符串可能会导致错误的结果或崩溃。 - Martin R
2个回答

1
你可以通过“反向引用”来实现,参考NSRegularExpression

\n

反向引用。匹配第n个捕获组所匹配的内容。n必须是大于等于1且小于等于模式中捕获组的总数的数字。

示例(使用 Swift extract regex matches 中的实用方法):

let string = "AAAAAAABBBCCCCCCDDE"
let pattern = "(.)\\1*"

let array = matches(for: pattern, in: string)
print(array)
// ["AAAAAAA", "BBB", "CCCCCC", "DD", "E"]

该模式匹配任意字符,后跟零个或多个“相同的”字符。如果您只对重复的“单词字符”感兴趣,请使用。
let pattern = "(\\w)\\1*"

代替。


1

您可以使用来自答案的此函数来实现该功能:

func matches(for regex: String, in text: String) -> [String] {

    do {
        let regex = try NSRegularExpression(pattern: regex)
        let results = regex.matches(in: text,
                                    range: NSRange(text.startIndex..., in: text))
        return results.map {
            String(text[Range($0.range, in: text)!])
        }
    } catch let error {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}

(.)\\1+作为regexAAAAAAABBBCCCCCCDD作为text传递,如下所示:
let result = matches(for: "(.)\\1+", in: "AAAAAAABBBCCCCCCDD")
print(result) // ["AAAAAAA", "BBB", "CCCCCC", "DD"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接