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组 中的任何字符
$
字符串结束
我正在尝试使用正则表达式解析字符串,但在尝试提取子字符串中的所有信息时遇到了一些问题。我快完成了,但此时我正在堆叠:
对于这样的字符串:
[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组 中的任何字符
$
字符串结束
[...]
的部分