1

vCardを解析するための次の正規表現があります:(VB)

        Dim options As New RegexOptions()
        options = RegexOptions.IgnoreCase Or RegexOptions.Multiline Or RegexOptions.IgnorePatternWhitespace
        regex = New Regex("(?<strElement>(N)) (;[^:]*)? (;CHARSET=UTF-8)? (:(?<strSurname>([^;\n\r]*))) (;(?<strGivenName>([^;\n\r]*)))? (;(?<strMidName>([^;\n\r]*)))? (;(?<strPrefix>([^;\n\r]*)))? (;(?<strSuffix>[^;\n\r]*))?", options)
        m = regex.Match(s)
        If m.Success Then
            Surname = m.Groups("strSurname").Value
            GivenName = m.Groups("strGivenName").Value
            MiddleName = m.Groups("strMidName").Value
            Prefix = m.Groups("strPrefix").Value
            Suffix = m.Groups("strSuffix").Value
        End If

次のような vCard がある場合に機能します。

BEGIN:VCARD
VERSION:2.1
N:Bacon;Kevin;Francis;Mr.;Jr.
FN: Mr. Kevin Francis Bacon Jr.
ORG:Movies.com

ただし、vCard が次のような場合は正しく機能しません。

BEGIN:VCARD
VERSION:2.1
N:Bacon;Kevin
FN:Kevin Bacon
ORG:Movies.com

正規表現は <strSuffix> を Kevin に割り当てますが、私が望んでいた <strGivenName> には割り当てません。どうすればこれを修正できますか?

適応された正規表現はここから来ました: vCard regex

4

2 に答える 2

2

あなたは正規表現パターンに慣れているはずです

^N(?:;(?!CHARSET=UTF-8)[^:]*|)(?:;CHARSET=UTF-8|):(?<strSurname>[^;\n\r]*);?(?<strGivenName>[^;\n\r]*);?(?<strMidName>[^;\n\r]*);?(?<strPrefix>[^;\n\r]*);?(?<strSuffix>[^;\n\r]*)

この例とこの例を参照してください。

于 2012-11-16T18:58:19.707 に答える
0

各行を一意の正規表現で解析することは避けますが、代わりに各行をトークン化します。次に、結果のプロセスで欠落している (オプションの) アイテムがあるかどうかを判断します。コードとデータ項目によって各行を単純にトークン化するパターンを次に示します (明示的なキャプチャと複数行を使用)。

^(?<Code>[^:]+)(:)((?<Tokens>[^;\r\n]+)(;?))+

これは、データが欠落しているかどうかのビジネス ロジックを処理する個々のコード オブジェクトを作成することに重点を置いています。失敗はもはや正規表現の失敗ではありませんが、ビジネス ロジックの後処理の失敗は、IMHO がデバッグして維持することをお勧めします。

于 2012-11-16T20:04:29.870 に答える