Swift-正则表达式查找结果的替换部分

Swift-正则表达式查找结果的替换部分,swift,regex,xcode,replace,Swift,Regex,Xcode,Replace,我的第一个问题。我有一个代码,它是单行字符串,有很多符号。字符串由许多类似的段组成,包括日期。我想搜索日期格式化程序为dd/mm/yy的字符串部分,并在日期格式化程序之前插入新行\n符号。我想使用正则表达式,但是我对swift/programing还不熟悉。 你能告诉我怎么做吗?多谢各位 //Input string Let configstring = "01/01/19 AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK 0000 1111 0000 00

我的第一个问题。我有一个代码,它是单行字符串,有很多符号。字符串由许多类似的段组成,包括日期。我想搜索日期格式化程序为dd/mm/yy的字符串部分,并在日期格式化程序之前插入新行\n符号。我想使用正则表达式,但是我对swift/programing还不熟悉。 你能告诉我怎么做吗?多谢各位

//Input string
Let configstring = "01/01/19 AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK 0000 1111 0000 0000 1111 0000 0000 LLLL 01/02/19 MMM NNN OOO PPP RRR SSS TTT UUU 0000 1111 1111 0000 1111 1111 0000 1111 0000 0000 WWWW "
预期结果字符串

Let configstring = "/n01/01/19 AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK 0000 1111 0000 0000 1111 0000 0000 LLLL /n01/02/19 MMM NNN OOO PPP RRR SSS TTT UUU 0000 1111 1111 0000 1111 1111 0000 1111 0000 0000 WWWW "

您可以使用
NSDataDetector
检测字符串中任何格式的日期,获取其NSRange,转换为
范围
,检查该范围内找到的字符串是否与所需的日期格式匹配,如果匹配,只需在
范围插入新行字符。lowerBound



操场测试:

var configstring = "01/01/19 AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK 0000 1111 0000 0000 1111 0000 0000 LLLL 01/02/19 MMM NNN OOO PPP RRR SSS TTT UUU 0000 1111 1111 0000 1111 1111 0000 1111 0000 0000 WWWW "

do {
    let ranges = try NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)
            .matches(in: configstring, range: .init(configstring.startIndex..., in: configstring))
            .compactMap { Range<String.Index>($0.range, in: configstring) }
    for range in ranges.reversed() {
        // check if the date found matches the desired format
        if let date = Formatter.customDate.date(from: String(configstring[range])) {
            print("date match:", date)
            configstring.insert("\n", at: range.lowerBound)
        }
    }
} catch { 
    print(error) 
}

print(configstring)  // "\n01/01/19 AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK 0000 1111 0000 0000 1111 0000 0000 LLLL \n01/02/19 MMM NNN OOO PPP RRR SSS TTT UUU 0000 1111 1111 0000 1111 1111 0000 1111 0000 0000 WWWW \n"

字符串中的日期是否始终有效?我刚刚编辑了日期格式化程序。日期是随机的,但格式始终为dd/mm/yy。我认为正则表达式模式应该基于这两个斜杠,但我不知道如何编写这个模式。您可以使用
(\d{2}\/\d{2}\/\d{4})
使用NSDataDetector给我带来了一个错误,然而正则表达式的工作方式很有魅力!非常感谢你!我已经加厚了你答案左边的绿色标记,谢谢!我不想开始新的话题,但我有另一个问题:通过使用Leo Dabus提供的相同方法,如何删除最后一个字符串段和在日期段附近添加的新行符号之间的所有空格?我有这个:LLLL\n01/02/19,我想要这个:LLLL\n01/02/19。问题是,在我的实际字符串中,每个日期段附近都有不同数量的空格。你的意思是在行尾修剪空格吗?是的,我想修剪行尾的空格,但是如果有一种方法可以找到已知正则表达式和最近字符之间的所有空格,而不是空格,我更喜欢这个方法,因为在不久的将来我可能需要这样的功能。非常感谢。
var configstring = "01/01/19 AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK 0000 1111 0000 0000 1111 0000 0000 LLLL 01/02/19 MMM NNN OOO PPP RRR SSS TTT UUU 0000 1111 1111 0000 1111 1111 0000 1111 0000 0000 WWWW "

do {
    let ranges = try NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)
            .matches(in: configstring, range: .init(configstring.startIndex..., in: configstring))
            .compactMap { Range<String.Index>($0.range, in: configstring) }
    for range in ranges.reversed() {
        // check if the date found matches the desired format
        if let date = Formatter.customDate.date(from: String(configstring[range])) {
            print("date match:", date)
            configstring.insert("\n", at: range.lowerBound)
        }
    }
} catch { 
    print(error) 
}

print(configstring)  // "\n01/01/19 AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK 0000 1111 0000 0000 1111 0000 0000 LLLL \n01/02/19 MMM NNN OOO PPP RRR SSS TTT UUU 0000 1111 1111 0000 1111 1111 0000 1111 0000 0000 WWWW \n"
let pattern = "\\d{2}/\\d{2}/\\d{2}"  // or "(\\d{2}/){2}\\d{2}" or "\\d{2}(/\\d{2}){2}"
var configstring = "01/01/19 AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK 0000 1111 0000 0000 1111 0000 0000 LLLL 01/02/19 MMM NNN OOO PPP RRR SSS TTT UUU 0000 1111 1111 0000 1111 1111 0000 1111 0000 0000 WWWW "
var startIndex = configstring.startIndex
while let range = configstring[startIndex...].range(of: pattern, options: .regularExpression) {
    // check if the date found matches the desired format
    if let date = Formatter.customDate.date(from: String(configstring[range])) {
        print("date match:", date)
        configstring.insert("\n", at: range.lowerBound)
    }
    startIndex = range.upperBound
}

print(configstring)  // "\n01/01/19 AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK 0000 1111 0000 0000 1111 0000 0000 LLLL \n01/02/19 MMM NNN OOO PPP RRR SSS TTT UUU 0000 1111 1111 0000 1111 1111 0000 1111 0000 0000 WWWW \n"