【问题标题】:Trying to parse out vCard name entry with Regex尝试使用正则表达式解析 vCard 名称条目
【发布时间】:2012-11-16 16:46:34
【问题描述】:

我有以下正则表达式来解析 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

正则表达式将 分配给 Kevin,而不是像我想要的那样分配 。我该如何解决这个问题?

改编的正则表达式来自这里:vCard regex

【问题讨论】:

  • 另外,我想知道这甚至可以在第一个示例输入上起作用。为什么不匹配N:VCARD?还是N:2.1?还是N: Mr. Kevin Francis Bacon Jr.? (好吧,实际上只有前两个是奇数,因为你只返回第一个匹配项)
  • 另一个:为什么要把Bacon分配给&lt;strGivenName&gt;?你的意思是Kevin?你的意思是&lt;strSurname&gt;
  • 我将 RegexOptions 添加到我原来的问题中,我的意思是 Kevin 作为 。很抱歉造成混乱。
  • IgnorePATTERNwhitepace 仅用于模式注释,不适用于正则表达式过程。您的模式中没有 cmets,也没有跨越多行;因此删除该选项。

标签: .net regex vcf-vcard


【解决方案1】:

你应该擅长正则表达式模式

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

参见 this 示例和 this 示例。

【讨论】:

    【解决方案2】:

    我会避免使用唯一的正则表达式解析每一行,而是对每一行进行标记。然后让生成的过程确定是否缺少(可选)项目。这是一种通过代码和数据项简单地标记每一行的模式(使用显式捕获和多行)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2011-02-02
      • 2012-07-19
      相关资源
      最近更新 更多