У меня есть следующее регулярное выражение для анализа 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
Это работает, когда у меня есть визитная карточка, например:
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› Кевину, а не ‹strGivenName›, как я хотел. Как я могу это исправить?
Адаптированное регулярное выражение взято отсюда: регулярное выражение vCard
N:VCARD
? ИлиN:2.1
? ИлиN: Mr. Kevin Francis Bacon Jr.
? (Ну, на самом деле только первые два нечетны, так как вы возвращаете только первое совпадение) - person Martin Ender   schedule 16.11.2012Bacon
был назначен на<strGivenName>
? Вы имели в видуKevin
? Вы имели в виду<strSurname>
? - person Martin Ender   schedule 16.11.2012