gpt4 book ai didi

c# - 用于解析用户代理字符串的正则表达式

转载 作者:太空宇宙 更新时间:2023-11-03 11:01:26 26 4
gpt4 key购买 nike

我完全是正则表达式的菜鸟。我有一堆要解析的用户代理字符串。

Windows Phone Search (Windows Phone OS 7.10;Acer;Allegro;7.10;8860)
Windows Phone Search (Windows Phone OS 7.10;HTC;7 Mozart T8698;7.10;7713)
Windows Phone Search (Windows Phone OS 7.10;HTC;Radar C110e;7.10;7720)

我如何使用正则表达式来提取:

A) Windows Phone 操作系统 7.10 宏碁 Allegro

B) Windows Phone 操作系统 7.10 HTC 7 Mozart

C) Windows Phone 操作系统 7.10 HTC 雷达

我曾尝试通过以下方式使用 Split 但无济于事:

private static string parse(string input) 
{
input = input.Remove(0, input.IndexOf('(') + 1).Replace(')', ' ').Trim();
string[] temp = input.Split(';');
if (temp[2].Contains('T'))
{
temp[2] = temp[2].Substring(0, temp[2].IndexOf('T')).Trim();
}
StringBuilder sb = new StringBuilder();
sb.Append(temp[0] + " ");
sb.Append(temp[1] + " ");
sb.Append(temp[2]);
return sb.ToString();
}

最佳答案

我使用正则表达式是因为它专门设计用于解析任何类型的文本。一旦理解了正则表达式模式的基础知识,它在任何文本情况下都会变得非常有用。

在此模式中,我的目标是将每个项目分离到命名的捕获组中,包括版本、电话、类型、主要和次要。通过正则表达式处理完成后,我可以使用 Linq 提取数据,如图所示。

string @pattern = @"
(?:OS\s) # Match but don't capture (MDC) OS, used an an anchor
(?<Version>\d\.\d+) # Version of OS
(?:;) # MDC ;
(?<Phone>[^;]+) # Get phone name up to ;
(?:;) # MDC ;
(?<Type>[^;]+) # Get phone type up to ;
(?:;) # MDC ;
(?<Major>\d\.\d+) # Major version
(?:;)
(?<Minor>\d+) # Minor Version
";

string data =
@"Windows Phone Search (Windows Phone OS 7.10;Acer;Allegro;7.10;8860)
Windows Phone Search (Windows Phone OS 7.10;HTC;7 Mozart T8698;7.10;7713)
Windows Phone Search (Windows Phone OS 7.10;HTC;Radar C110e;7.10;7720)";

// Ignore pattern white space allows us to comment the pattern, it is not a regex processing command
var phones = Regex.Matches(data, pattern, RegexOptions.IgnorePatternWhitespace)
.OfType<Match>()
.Select (mt => new
{
Name = mt.Groups["Phone"].Value.ToString(),
Type = mt.Groups["Type"].Value.ToString(),
Version = string.Format( "{0}.{1}", mt.Groups["Major"].Value.ToString(),
mt.Groups["Minor"].Value.ToString())
}
);

Console.WriteLine ("Phones Supported are:");

phones.Select(ph => string.Format("{0} of type {1} version ({2})", ph.Name, ph.Type, ph.Version))
.ToList()
.ForEach(Console.WriteLine);

/* Output
Phones Supported are:
Acer of type Allegro version (7.10.8860)
HTC of type 7 Mozart T8698 version (7.10.7713)
HTC of type Radar C110e version (7.10.7720)
*/

关于c# - 用于解析用户代理字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17604015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com