Regex来分析用户代理字符串
本文关键字:用户代理 字符串 Regex | 更新日期: 2023-09-27 18:22:11
我对regex完全没有兴趣。我有一堆要解析的用户代理字符串。
Windows Phone Search(Windows Phone OS 7.10;Acer;Allegro;7.10;8860)
Windows Phone搜索(Windows Phone OS 7.10;HTC;7 Mozart T8698;7.10;7713)
Windows Phone搜索(Windows Phone OS 7.10;HTC;雷达C110e;7.10;7720)
如何使用正则表达式来提取:
A) Windows Phone操作系统7.10 Acer 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();
}
我使用正则表达式,因为它是专门为解析任何类型的文本而设计的。一旦了解了正则表达式模式的基本知识,它在任何文本情况下都会变得非常有用。
在这个模式中,我的目标是将每个项目分为命名的捕获组,即Version、Phone、Type、Major和Minor。一旦regex处理完成,我就可以使用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)
*/
此正则表达式将捕获它:
(?<='().*?;.*?;.*?(?=;)
作为代码:
string s = Regex.Match(input, @"(?<='().*?;.*?;.*?(?=;)").Value
作为正则表达式的分解:
(?<='()
=断言前一个字符为文字开括号的"look-behind"(
.*?;
=直到下一个;
的所有内容的匹配(非贪婪-不会跳过;
)(?=;)
=断言下一个字符为字面分号的"前瞻";