试图解析出电子名片名称输入与正则表达式(Trying to parse out vCard name

2019-10-17 10:05发布

我有以下的正则表达式解析出一个电子名片(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

它的工作原理时,我有一个像电子名片:

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

但是,当电子名片是这样它不能正常工作:

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

正则表达式分配<strSuffix>凯文,而不是<strGivenName>像我想要的。 我怎样才能解决这个问题?

改编正则表达式从这里走过: 电子名片的正则表达式

Answer 1:

你要善于用正则表达式模式

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

这个例子, 这个例子。



Answer 2:

我想避免解析了一个独特的正则表达式的每一行,而是记号化的每一行。 然后,已产生的过程中判断是否存在缺失(可选)项目。 下面是它简单地由标记化它的代码和数据项( 使用显式捕获&多行 )每行的图案。

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

这就是将重点放在创建其处理数据是否丢失或没有业务逻辑的专用代码的对象。 失败不再是正则表达式的失败,但是业务逻辑处理后故障恕我直言,这是更好的调试和维护。



文章来源: Trying to parse out vCard name entry with Regex
标签: .net regex vcard