我有一个这样的字符串:
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))
答案 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+
regex
和AAAAAAABBBCCCCCCDD
传递为text
,如下所示:
let result = matches(for: "(.)\\1+", in: "AAAAAAABBBCCCCCCDD")
print(result) // ["AAAAAAA", "BBB", "CCCCCC", "DD"]