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"]]

今私の問題はこれです、メッセージが':'それを持っているならば、結果の配列は同じフォーマットに従わず、解析機能を壊します。

だから私は正規表現でいくつかのケースを見逃していると思います、誰かがこれで私を助けることができますか?前もって感謝します。

4番目の鳥

このパターンでは、非常に幅広い一致のパーツを使用しています。

たとえば、.+は最初に行末まで一致し、[\\S ]*空白以外の文字またはスペースのいずれかに[^-]*一致し、-

破損する可能性がある理由は、部分一致が文字列の最後まで最初に一致するためです。:パターンではシングルが必須であるため、文字列の末尾から:空白が続くまでバックトラックし、パターンの残りの部分と一致しようとします。

:メッセージ部分に別のもの追加すると、メッセージグループが短くなると予想されるよりも早くバックトラックが停止する可能性があります。


パターンをもう少し正確にして:、グループを壊さずに最後の部分も含めることができるようにすることができます。

 (\[[^][]*\])\s([^:]*):\s(.*)$
  • (\[[^][]*\])角括弧を閉じるまで開口部から部分一致[...]グループ1
  • \s 空白文字と一致する
  • ([^:]*):以外の任意の文字と一致:グループ2を、その後、予想と一致:
  • \s(.*)空白文字と一致し、グループ3の任意の文字の0倍以上をキャプチャします
  • $ 文字列の終わり

正規表現のデモ

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事