微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift 中的正则表达式

如何解决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: $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 ]* 将匹配非空白字符或空格,而 [^-]* 匹配除 {{1 }}

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

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


您可以使模式更精确一些,以便最后一部分也可以包含 : 而不会破坏组。

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

Regex demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?