Swift 中的正则表达式

Regular expression in Swift

我正在尝试使用正则表达式解析字符串,但在尝试提取子字符串中的所有信息时遇到了一些问题。我快完成了,但此时我正在堆叠:

对于这样的字符串:

[00/0/00, 00:00:00] User: This is the message text and any other stuff

我可以使用以下代码解析 Swift 中的日期、用户和消息:

let line = "[00/0/00, 00:00:00] User: This is the message text and any other stuff"
let result = line.match("(.+)\s([\S ]*):\s(.*\n(?:[^-]*)*|.*)$")
extension String {
    func match(_ regex: String) -> [[String]] {
        let nsString = self as NSString
        return (try? NSRegularExpression(pattern: regex, options: []))?.matches(in: self, options: [], range: NSMakeRange(0, count)).map { match in
            (0..<match.numberOfRanges).map { match.range(at: [=12=]).location == NSNotFound ? "" : nsString.substring(with: match.range(at: [=12=])) }
        } ?? []
    }
}

生成的数组是这样的:

[["[00/0/00, 00:00:00] User: This is the message text and any other stuff","[00/0/00, 00:00:00]","User","This is the message text and any other stuff"]]

现在我的问题是,如果消息上有 ':',生成的数组将不遵循相同的格式并破坏解析功能。

所以我想我在正则表达式中遗漏了一些情况,有人可以帮我解决这个问题吗?提前致谢。

在该模式中,您使用了非常广泛匹配的部分。

例如,.+ 将首先匹配直到行尾,[\S ]* 将匹配非白色 space 字符或 space 和 [^-]* 匹配除 -

之外的任何字符

它可能会中断的原因是广泛匹配首先匹配直到字符串的末尾。由于单个 : 在您的模式中是强制性的,它将从字符串的末尾回溯,直到它可以匹配 : 后跟白色 space,然后尝试匹配其余部分的模式。

在消息部分添加另一个 :,可能会导致回溯比您预期的更短消息组更早停止。


您可以使模式更精确一些,这样最后一部分也可以包含 : 而不会打断分组。

 (\[[^][]*\])\s([^:]*):\s(.*)$
  • (\[[^][]*\]) 匹配 group 1
  • 中从左到右方括号 [...] 的部分
  • \s 匹配白色space 字符
  • ([^:]*): 匹配 组 2 中除 : 之外的任何字符,然后匹配预期的 :
  • \s(.*)匹配一个白色space字符,并捕获0+次第3组
  • 中的任何字符
  • $ 字符串结束

Regex demo