使用正则表达式以特定字符分组开始和结束的组

时间:2018-01-07 14:31:45

标签: arrays regex swift string

我有一个像这样的字符串......

var string = "A12345678B119292A88B2222A883849B123"

---> (var string = " A 12345678 B 119292 A 88 2222 A 883849 123“)

...并且喜欢将字符串拆分为以'A'开头并以' B '结尾的特定组,以获得如下结果:

resultArray: "12345678", "88", "883849"

这是我到目前为止所发现的:

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 []
    }
}

let string = "A12345678B119292A88B2222A883849B123"
let pattern = "\\.*A.*B" // pattern error

let array = matches(for: pattern, in: string)
print(array)

[?]如何使用regex和Swift实现此结果?

2 个答案:

答案 0 :(得分:1)

你可以通过“积极的外观/前瞻”实现这一目标 (比较Lookahead and Lookbehind Zero-Length Assertions):

let string = "A12345678B119292A88B2222A883849B123"
let pattern = "(?<=A).*?(?=B)"

let array = matches(for: pattern, in: string)
print(array)
// ["12345678", "88", "883849"]

模式匹配任意字符序列, 之前是“A”,后跟“B”。

另请注意使用方法 “非贪婪”模式.*?,否则你会得到 第一个“A”和最后一个“B”之间的单个匹配。

答案 1 :(得分:0)

除非您有其他示例,否则您可以使用

(?<=A)\d+(?=B)

a demo on regex101.com

<小时/> 请注意,您需要双重转义反斜杠,因此您需要改为编写(?<=A)\\d+(?=B)