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

时间:2018-01-07 13:01:44

标签: regex swift string

我有一个这样的字符串:

var string = "AAAAAAABBBCCCCCCDD"

并喜欢使用正则表达式将字符串拆分为此格式的数组(same characters --> same group

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))

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以使用此answer

中的此功能实现此目的
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"]