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]+)(;?))+

这将重点放在创建单独的代码对象上,这些代码对象处理数据是否丢失的业务逻辑。故障不再是正则表达式故障,而是业务逻辑后处理故障,恕我直言,更好地调试和维护。

于 2012-11-16T20:04:29.870 回答