我试图用正则表达式解析字符串,但尝试提取子字符串中的所有信息时遇到了一些问题。我差不多完成了,但是我现在已经堆砌了:
对于这样的字符串:
[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: $0).location == NSNotFound ? "" : nsString.substring(with: match.range(at: $0)) }
} ?? []
}
}
结果数组如下所示:
[["[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 ]*
将匹配一个非空白char或一个空格,并[^-]*
匹配除a以外的任何char-
它可能会中断的原因是,广泛匹配会先匹配到字符串结尾。由于:
您的模式中必须包含单个字符,因此它将从字符串的末尾开始回溯,直到可以匹配:
后跟一个空格的空白,然后尝试匹配该模式的其余部分。
:
在消息部分中添加另一个可能会导致回溯停止的时间比使消息组更短的时间早。
您可以使模式更加精确,以便最后一部分也可以包含:
而不会破坏组。
(\[[^][]*\])\s([^:]*):\s(.*)$
(\[[^][]*\])
匹配部分从开口至右方括号[...]
中组1\s
匹配空白字符([^:]*):
匹配任何炭除了:
在第2组,然后匹配的预期:
\s(.*)
匹配空白字符,并捕获第3组中任何字符的0+次$
字符串结尾本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句