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
。
答案 0 :(得分:2)
^(.*)\(.*;(?<model>(?!( wv))[^;()]*(\(.??\))?[^;)]*)+?(;.*)?\).*$
匹配
负面的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;用于删除无意字符的功能。