从设备名称中提取模型

时间:2018-03-23 06:32:07

标签: c# regex

Mozilla/2.0 (Linux; Android 2.0; KK; SAMSUNG SM-G900H Build/LRX21T) AppleWebKit

需要提取SAMSUNG SM-G900H Build/LRX21T

Mozilla/5.0 (Linux; Android 5.0; SAMSUNG SM-G900H Build/LRX21T) AppleWebKit

需要提取SAMSUNG SM-G900H Build/LRX21T

Mozilla/5.0 (Linux; Android 5.1; XT1032 Build/LPBS23.13-56-2; wv) AppleWebKit

需要提取XT1032 Build/LPBS23.13-56-2

逻辑是:

1. Take first [(.....)]
2. Take text after last semicolon [;]
3. Or take text after last semicolon [;] and before [; wv]

我现在拥有的东西:

.*?\(.*;(?<model>.*?)(; wv)?\)

但这适用于前两个示例,而第三个示例则返回wv

3 个答案:

答案 0 :(得分:2)

^(.*)\(.*;(?<model>(?!( wv))[^;()]*(\(.??\))?[^;)]*)+?(;.*)?\).*$

匹配

  • Mozilla / 5.0(Linux; Android 5.1; XT1032 Build / LPBS23.13-56-2 ; wv) AppleWebKit
  • Mozilla / 5.0(Linux; Android 5.0; SAMSUNG SM-G900H Build / LRX21T )AppleWebKit
  • Mozilla / 5.0(Linux; Android 5.0; SAMSUNG SM-G900H Build / LRX21T )AppleWebKit / 537.36(KHTML,与Gecko一样)SamsungBrowser / 4.0 Chrome / 44.0.2403.133 Mobile Safari / 537.36
  • Mozilla / 5.0(Linux; Android 6.0.1; Moto G(4)Build / MPJ24.139-23.1 )AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 64.0。 3282.137 Mobile Safari / 537.36

负面的lookAhead((?! wv))为我做了。

我想你仍然可以使表达更加纤细,但这首应该适合(与/ gi-Flags一起使用[全局,不区分大小写]。

使其发挥作用的重要事项:

  • 否定前瞻(?!...)
  • 懒惰量词? (第二个'?'制作 它懒惰,不贪心)

编辑:添加了条件:匹配组中可能不包含')' EDIT2:修改后的表达式,使其适合更多的字符串

答案 1 :(得分:1)

这个怎么样:

;\s*(?<model>([^;)])*)

我刚尝试过,第二次匹配将返回指定组中的所需字符串。这与

不符
Mozilla/5.0 (Linux
但是,

部分,但似乎你不需要那部分。

答案 2 :(得分:0)

只需将分号拆分为数组:

string[] parts = myUserAgent.Split(";");

现在你可以得到&#34; SAMSUNG ....&#34;由:

string temp = parts[3];

最后使用&#34;替换&#34;用于删除无意字符的功能。