user_agent_parser 2.5.2 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,17 +1,63 @@
1
1
  user_agent_parsers:
2
2
  #### SPECIAL CASES TOP ####
3
3
 
4
+ # ESRI Server products
5
+ - regex: '(GeoEvent Server) (\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
6
+
7
+ # ESRI ArcGIS Desktop Products
8
+ - regex: '(ArcGIS Pro)(?: (\d+)\.(\d+)\.([^ ]+)|)'
9
+
10
+ - regex: 'ArcGIS Client Using WinInet'
11
+ family_replacement: 'ArcMap'
12
+
13
+ - regex: '(OperationsDashboard)-(?:Windows)-(\d+)\.(\d+)\.(\d+)'
14
+ family_replacement: 'Operations Dashboard for ArcGIS'
15
+
16
+ - regex: '(arcgisearth)/(\d+)\.(\d+)(?:\.(\d+)|)'
17
+ family_replacement: 'ArcGIS Earth'
18
+
19
+ - regex: 'com.esri.(earth).phone/(\d+)\.(\d+)(?:\.(\d+)|)'
20
+ family_replacement: 'ArcGIS Earth'
21
+
22
+ # ESRI ArcGIS Mobile Products
23
+ - regex: '(arcgis-explorer)/(\d+)\.(\d+)\.(\d+)'
24
+ family_replacement: 'Explorer for ArcGIS'
25
+
26
+ - regex: 'arcgis-(collector|aurora)/(\d+)\.(\d+)\.(\d+)'
27
+ family_replacement: 'Collector for ArcGIS'
28
+
29
+ - regex: '(arcgis-workforce)/(\d+)\.(\d+)\.(\d+)'
30
+ family_replacement: 'Workforce for ArcGIS'
31
+
32
+ - regex: '(Collector|Explorer|Workforce)-(?:Android|iOS)-(\d+)\.(\d+)(?:\.(\d+)|)'
33
+ family_replacement: '$1 for ArcGIS'
34
+
35
+ - regex: '(Explorer|Collector)/(\d+) CFNetwork'
36
+ family_replacement: '$1 for ArcGIS'
37
+
38
+ # ESRI ArcGIS Runtimes
39
+ - regex: 'ArcGISRuntime-(Android|iOS|NET|Qt)/(\d+)\.(\d+)(?:\.(\d+)|)'
40
+ family_replacement: 'ArcGIS Runtime SDK for $1'
41
+
42
+ - regex: 'ArcGIS\.?(iOS|Android|NET|Qt)(?:-|\.)(\d+)\.(\d+)(?:\.(\d+)|)'
43
+ family_replacement: 'ArcGIS Runtime SDK for $1'
44
+
45
+ - regex: 'ArcGIS\.Runtime\.(Qt)\.(\d+)\.(\d+)(?:\.(\d+)|)'
46
+ family_replacement: 'ArcGIS Runtime SDK for $1'
47
+
4
48
  # CFNetwork Podcast catcher Applications
49
+ - regex: '^(Luminary)[Stage]+/(\d+) CFNetwork'
5
50
  - regex: '(ESPN)[%20| ]+Radio/(\d+)\.(\d+)\.(\d+) CFNetwork'
6
51
  - regex: '(Antenna)/(\d+) CFNetwork'
7
52
  family_replacement: 'AntennaPod'
8
53
  - regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
9
54
  - regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
10
- - regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
11
- - regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
12
- - regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
55
+ - regex: '^(.{0,200})-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
56
+ - regex: '^(.{0,200})-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
57
+ - regex: '^(.{0,200})/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
13
58
 
14
59
  # Podcast catchers
60
+ - regex: '^(Luminary)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
15
61
  - regex: '(espn\.go)'
16
62
  family_replacement: 'ESPN'
17
63
  - regex: '(espnradio\.com)'
@@ -48,6 +94,10 @@ user_agent_parsers:
48
94
  - regex: '(Tableau)/(\d+)\.(\d+)'
49
95
  family_replacement: 'Tableau'
50
96
 
97
+ # Adobe CreativeCloud
98
+ - regex: 'AppleWebKit/\d{1,10}\.\d{1,10}.{0,200} Safari.{0,200} (CreativeCloud)/(\d+)\.(\d+).(\d+)'
99
+ family_replacement: 'Adobe CreativeCloud'
100
+
51
101
  # Salesforce
52
102
  - regex: '(Salesforce)(?:.)\/(\d+)\.(\d?)'
53
103
 
@@ -60,7 +110,7 @@ user_agent_parsers:
60
110
  family_replacement: 'FacebookBot'
61
111
 
62
112
  # Google Plus
63
- - regex: 'Google.*/\+/web/snippet'
113
+ - regex: 'Google.{0,50}/\+/web/snippet'
64
114
  family_replacement: 'GooglePlusBot'
65
115
 
66
116
  # Gmail
@@ -73,52 +123,65 @@ user_agent_parsers:
73
123
 
74
124
  # Twitter
75
125
  - regex: '(Twitterbot)/(\d+)\.(\d+)'
76
- family_replacement: 'TwitterBot'
126
+ family_replacement: 'Twitterbot'
77
127
 
78
- # Bots Pattern '/name-0.0'
128
+ # Bots Pattern 'name/0.0.0'
79
129
  - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
80
- # Bots Pattern 'name/0.0'
81
- - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
130
+ # Bots Pattern 'name/0.0.0'
131
+ - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|Pandora|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
82
132
 
83
133
  # MSIECrawler
84
- - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
134
+ - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.{0,200} MSIECrawler'
85
135
  family_replacement: 'MSIECrawler'
86
136
 
87
137
  # DAVdroid
88
138
  - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
89
139
 
90
140
  # Downloader ...
91
- - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
141
+ - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
92
142
 
93
143
  # Pinterestbot
94
144
  - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
95
145
  family_replacement: 'Pinterestbot'
96
146
 
97
147
  # Bots
98
- - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|TwitterBot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
148
+ - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PHPCrawl|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
99
149
 
100
150
  # AWS S3 Clients
101
151
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
102
- - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
152
+ - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\d{1,2}|core)))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
153
+
154
+ # SAFE FME
155
+ - regex: '(FME)\/(\d+\.\d+)\.(\d+)\.(\d+)'
156
+
157
+ # QGIS
158
+ - regex: '(QGIS)\/(\d)\.?0?(\d{1,2})\.?0?(\d{1,2})'
159
+
160
+ # JOSM
161
+ - regex: '(JOSM)/(\d+)\.(\d+)'
162
+
163
+ # Tygron Platform
164
+ - regex: '(Tygron Platform) \((\d+)\.(\d+)\.(\d+(?:\.\d+| RC \d+\.\d+))'
103
165
 
104
166
  # Facebook
105
167
  # Must come before "Bots General matcher" to catch OrangeBotswana
106
168
  # Facebook Messenger must go before Facebook
107
- - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
169
+ - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
170
+
108
171
  family_replacement: 'Facebook Messenger'
109
172
  # Facebook
110
- - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
+ - regex: '\[FB.{0,300};(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
111
174
  family_replacement: 'Facebook'
112
175
  # Sometimes Facebook does not specify a version (FBAV)
113
- - regex: '\[FB.*;'
176
+ - regex: '\[FB.{0,300};'
114
177
  family_replacement: 'Facebook'
115
178
 
116
179
  # Bots General matcher 'name/0.0'
117
- - regex: '(?:\/[A-Za-z0-9\.]+|) {0,5}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
180
+ - regex: '^.{0,200}?(?:\/[A-Za-z0-9\.]{0,50}|) {0,2}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
118
181
  # Bots containing bot(but not CUBOT)
119
- - regex: '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
182
+ - regex: '^.{0,200}?((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
120
183
  # Bots containing spider|scrape|Crawl
121
- - regex: '((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
184
+ - regex: '^.{0,200}?((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
122
185
 
123
186
  # HbbTV standard defines what features the browser should understand.
124
187
  # but it's like targeting "HTML5 browsers", effective browser support depends on the model
@@ -134,18 +197,28 @@ user_agent_parsers:
134
197
 
135
198
  # Social Networks (non-Facebook)
136
199
  # Pinterest
137
- - regex: '\[(Pinterest)/[^\]]+\]'
200
+ - regex: '\[(Pinterest)/[^\]]{1,50}\]'
138
201
  - regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
139
202
  # Instagram app
140
- - regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
203
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Instagram).(\d+)\.(\d+)\.(\d+)'
141
204
  # Flipboard app
142
- - regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard).(\d+)\.(\d+)\.(\d+)'
143
206
  # Flipboard-briefing app
144
- - regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
145
208
  # Onefootball app
146
- - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
147
210
  # Snapchat
148
211
  - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
212
+ # Twitter
213
+ - regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
214
+ family_replacement: 'Twitter'
215
+
216
+ # aspiegel.com spider (owned by Huawei)
217
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
218
+ family_replacement: 'Spider'
219
+
220
+ - regex: 'AspiegelBot'
221
+ family_replacement: 'Spider'
149
222
 
150
223
  # Basilisk
151
224
  - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
@@ -162,7 +235,7 @@ user_agent_parsers:
162
235
  family_replacement: 'Firefox Mobile'
163
236
  - regex: '(Fennec)/(\d+)\.(\d+)'
164
237
  family_replacement: 'Firefox Mobile'
165
- - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
238
+ - regex: '(?:Mobile|Tablet);.{0,200}(Firefox)/(\d+)\.(\d+)'
166
239
  family_replacement: 'Firefox Mobile'
167
240
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
168
241
  family_replacement: 'Firefox ($1)'
@@ -176,7 +249,7 @@ user_agent_parsers:
176
249
  family_replacement: 'Firefox Beta'
177
250
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
178
251
  family_replacement: 'Firefox ($1)'
179
- - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
252
+ - regex: '(Firefox).{0,200}Tablet browser (\d+)\.(\d+)\.(\d+)'
180
253
  family_replacement: 'MicroB'
181
254
  - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
182
255
  - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
@@ -208,24 +281,24 @@ user_agent_parsers:
208
281
 
209
282
  # Opera will stop at 9.80 and hide the real version in the Version string.
210
283
  # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
211
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
284
+ - regex: '(Opera Tablet).{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
212
285
  - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
213
- - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
286
+ - regex: '(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\d+)\.(\d+)'
214
287
  family_replacement: 'Opera Mobile'
215
- - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
288
+ - regex: '(Opera)/(\d+)\.(\d+).{1,100}Opera Mobi'
216
289
  family_replacement: 'Opera Mobile'
217
- - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
290
+ - regex: 'Opera Mobi.{1,100}(Opera)(?:/|\s+)(\d+)\.(\d+)'
218
291
  family_replacement: 'Opera Mobile'
219
292
  - regex: 'Opera Mobi'
220
293
  family_replacement: 'Opera Mobile'
221
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
294
+ - regex: '(Opera)/9.80.{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
222
295
 
223
296
  # Opera 14 for Android uses a WebKit render engine.
224
- - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
297
+ - regex: '(?:Mobile Safari).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
225
298
  family_replacement: 'Opera Mobile'
226
299
 
227
300
  # Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
228
- - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
301
+ - regex: '(?:Chrome).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
229
302
  family_replacement: 'Opera'
230
303
 
231
304
  # Opera Coast
@@ -237,7 +310,7 @@ user_agent_parsers:
237
310
  family_replacement: 'Opera Mini'
238
311
 
239
312
  # Opera Neon
240
- - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
313
+ - regex: 'Chrome/.{1,200}( MMS)/(\d+).(\d+).(\d+)'
241
314
  family_replacement: 'Opera Neon'
242
315
 
243
316
  # Palm WebOS looks a lot like Safari.
@@ -284,7 +357,7 @@ user_agent_parsers:
284
357
 
285
358
  - regex: '(Symphony) (\d+).(\d+)'
286
359
 
287
- - regex: 'PLAYSTATION 3.+WebKit'
360
+ - regex: 'PLAYSTATION 3.{1,200}WebKit'
288
361
  family_replacement: 'NetFront NX'
289
362
  - regex: 'PLAYSTATION 3'
290
363
  family_replacement: 'NetFront'
@@ -293,7 +366,7 @@ user_agent_parsers:
293
366
  - regex: '(PlayStation Vita)'
294
367
  family_replacement: 'NetFront NX'
295
368
 
296
- - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
369
+ - regex: 'AppleWebKit.{1,200} (NX)/(\d+)\.(\d+)\.(\d+)'
297
370
  family_replacement: 'NetFront NX'
298
371
  - regex: '(Nintendo 3DS)'
299
372
  family_replacement: 'NetFront NX'
@@ -306,7 +379,9 @@ user_agent_parsers:
306
379
  - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
307
380
 
308
381
  # Edge Mobile
309
- - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
382
+ - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
383
+ family_replacement: 'Edge Mobile'
384
+ - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
310
385
  family_replacement: 'Edge Mobile'
311
386
 
312
387
  # Samsung Internet (based on Chrome, but lacking some features)
@@ -347,14 +422,34 @@ user_agent_parsers:
347
422
  - regex: '(Mint Browser)/(\d+)\.(\d+)\.(\d+)'
348
423
  family_replacement: 'Mint Browser'
349
424
 
425
+ # TopBuzz Android must go before Chrome Mobile WebView
426
+ - regex: '(TopBuzz)/(\d+).(\d+).(\d+)'
427
+ family_replacement: 'TopBuzz'
428
+
350
429
  # Google Search App on Android, eg:
351
- - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
430
+ - regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
352
431
  family_replacement: 'Google'
353
432
 
433
+ # QQ Browsers
434
+ - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
435
+ family_replacement: 'QQ Browser Mini'
436
+ - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
437
+ family_replacement: 'QQ Browser Mobile'
438
+ - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
439
+ family_replacement: 'QQ Browser'
440
+
441
+ # DuckDuckGo
442
+ - regex: 'Mobile.{0,200}(DuckDuckGo)/(\d+)'
443
+ family_replacement: 'DuckDuckGo Mobile'
444
+
445
+ # Tenta Browser
446
+ - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)'
447
+ family_replacement: 'Tenta Browser'
448
+
354
449
  # Chrome Mobile
355
- - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
450
+ - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
356
451
  family_replacement: 'Chrome Mobile WebView'
357
- - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
452
+ - regex: '; wv\).{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
358
453
  family_replacement: 'Chrome Mobile WebView'
359
454
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
360
455
  family_replacement: 'Chrome Mobile'
@@ -362,7 +457,7 @@ user_agent_parsers:
362
457
  family_replacement: 'Chrome Mobile iOS'
363
458
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
364
459
  family_replacement: 'Chrome Mobile'
365
- - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
460
+ - regex: ' Mobile .{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
366
461
  family_replacement: 'Chrome Mobile'
367
462
 
368
463
  # Chrome Frame must come before MSIE.
@@ -377,18 +472,13 @@ user_agent_parsers:
377
472
  - regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
378
473
  family_replacement: 'Sogou Explorer'
379
474
 
380
- # QQ Browsers
381
- - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
382
- family_replacement: 'QQ Browser Mini'
383
- - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
384
- family_replacement: 'QQ Browser Mobile'
385
- - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
386
- family_replacement: 'QQ Browser'
387
-
388
475
  # Rackspace Monitoring
389
476
  - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
390
477
  family_replacement: 'RackspaceBot'
391
478
 
479
+ # PRTG Network Monitoring
480
+ - regex: '(PRTG Network Monitor)'
481
+
392
482
  # PyAMF
393
483
  - regex: '(PyAMF)/(\d+)\.(\d+)\.(\d+)'
394
484
 
@@ -397,7 +487,7 @@ user_agent_parsers:
397
487
  family_replacement: 'Yandex Browser'
398
488
 
399
489
  # Mail.ru Amigo/Internet Browser (Chromium-based)
400
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
490
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME'
401
491
  family_replacement: 'Mail.ru Chromium Browser'
402
492
 
403
493
  # AOL Browser (IE-based)
@@ -417,10 +507,16 @@ user_agent_parsers:
417
507
  - regex: '(Whale)/(\d+)\.(\d+)\.(\d+)'
418
508
  family_replacement: 'Whale'
419
509
 
510
+ # 1Password
511
+ - regex: '(1Password)/(\d+)\.(\d+)\.(\d+)'
512
+
420
513
  # Ghost
421
514
  # @ref: http://www.ghost.org
422
515
  - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
423
516
 
517
+ # Palo Alto GlobalProtect Linux
518
+ - regex: 'PAN (GlobalProtect)/(\d+)\.(\d+)\.(\d+) .{1,100} \(X11; Linux x86_64\)'
519
+
424
520
  #### END SPECIAL CASES TOP ####
425
521
 
426
522
  #### MAIN CASES - this catches > 50% of all browsers ####
@@ -454,7 +550,7 @@ user_agent_parsers:
454
550
  v1_replacement: '2013'
455
551
 
456
552
  # Outlook 2016
457
- - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+'
553
+ - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+|MSOffice 16'
458
554
  family_replacement: 'Outlook'
459
555
  v1_replacement: '2016'
460
556
 
@@ -462,7 +558,7 @@ user_agent_parsers:
462
558
  - regex: 'Microsoft Office (Word) 2014'
463
559
 
464
560
  # Windows Live Mail
465
- - regex: 'Outlook-Express\/7\.0.*'
561
+ - regex: 'Outlook-Express\/7\.0'
466
562
  family_replacement: 'Windows Live Mail'
467
563
 
468
564
  # Apple Air Mail
@@ -484,6 +580,11 @@ user_agent_parsers:
484
580
  - regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+)|)'
485
581
  family_replacement: 'Lotus Notes'
486
582
 
583
+ # Superhuman Mail Client
584
+ # @ref: https://www.superhuman.com
585
+ - regex: 'Superhuman'
586
+ family_replacement: 'Superhuman'
587
+
487
588
  # Vivaldi uses "Vivaldi"
488
589
  - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
489
590
 
@@ -497,7 +598,7 @@ user_agent_parsers:
497
598
  family_replacement: 'Brave'
498
599
 
499
600
  # Iron Browser ~since version 50
500
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
601
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]'
501
602
  family_replacement: 'Iron'
502
603
 
503
604
  # Dolphin Browser
@@ -573,20 +674,20 @@ user_agent_parsers:
573
674
  - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
574
675
  - regex: '^(Stitcher)/iOS'
575
676
  - regex: '^(Stitcher)/Android'
576
- - regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
677
+ - regex: '^(VLC) .{0,200}version (\d+)\.(\d+)\.(\d+)'
577
678
  - regex: ' (VLC) for'
578
679
  - regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
579
680
  family_replacement: 'VLC'
580
- - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
581
- - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
582
- - regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
681
+ - regex: '^(foobar)\S{1,10}/(\d+)\.(\d+|)\.?([\da-z]+|)'
682
+ - regex: '^(Clementine)\S{1,10} (\d+)\.(\d+|)\.?(\d+|)'
683
+ - regex: '(amarok)/(\d+)\.(\d+|)\.?(\d+|)'
583
684
  family_replacement: 'Amarok'
584
685
  - regex: '(Custom)-Feed Reader'
585
686
 
586
687
  # Browser major_version.minor_version.beta_version (space instead of slash)
587
688
  - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
588
689
  # Browser major_version.minor_version (space instead of slash)
589
- - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)\.(\d+)(?:\.(\d+)|)'
690
+ - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
590
691
 
591
692
  # Kindle WebKit
592
693
  - regex: '(Kindle)/(\d+)\.(\d+)'
@@ -613,7 +714,7 @@ user_agent_parsers:
613
714
 
614
715
  # desktop mode
615
716
  # http://www.anandtech.com/show/3982/windows-phone-7-review
616
- - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
717
+ - regex: '(MSIE) (\d+)\.(\d+).{0,100}XBLWP7'
617
718
  family_replacement: 'IE Large Screen'
618
719
 
619
720
  # Nextcloud desktop sync client
@@ -630,6 +731,17 @@ user_agent_parsers:
630
731
  - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
631
732
  family_replacement: 'Skype'
632
733
 
734
+ # OpenVAS Scanner
735
+ - regex: '(OpenVAS)(?:-VT)?(?:[ \/](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
736
+ family_replacement: 'OpenVAS Scanner'
737
+
738
+ # AnyConnect
739
+ - regex: '(AnyConnect)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
740
+
741
+ # Monitis
742
+ - regex: 'compatible; monitis'
743
+ family_replacement: 'Monitis'
744
+
633
745
  #### END MAIN CASES ####
634
746
 
635
747
  #### SPECIAL CASES ####
@@ -657,22 +769,26 @@ user_agent_parsers:
657
769
  - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+|)'
658
770
  family_replacement: 'Bon Echo'
659
771
 
772
+ # topbuzz on IOS
773
+ - regex: '(TopBuzz) com.alex.NewsMaster/(\d+).(\d+).(\d+)'
774
+ family_replacement: 'TopBuzz'
775
+ - regex: '(TopBuzz) com.mobilesrepublic.newsrepublic/(\d+).(\d+).(\d+)'
776
+ family_replacement: 'TopBuzz'
777
+ - regex: '(TopBuzz) com.topbuzz.videoen/(\d+).(\d+).(\d+)'
778
+ family_replacement: 'TopBuzz'
779
+
660
780
  # @note: iOS / OSX Applications
661
- - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+) Mobile'
781
+ - regex: '(iPod|iPhone|iPad).{1,200}GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
662
782
  family_replacement: 'Google'
663
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
783
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|).{1,200}[ +]Safari'
664
784
  family_replacement: 'Mobile Safari'
665
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
785
+ - regex: '(iPod|iPod touch|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +](\d+)_(\d+)(?:_(\d+)|).{0,30} AppleNews\/\d+\.\d+(?:\.\d+|)'
666
786
  family_replacement: 'Mobile Safari UI/WKWebView'
667
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
787
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
668
788
  family_replacement: 'Mobile Safari UI/WKWebView'
669
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile.*[ +]Safari'
789
+ - regex: '(iPod|iPod touch|iPhone|iPad).{0,200} Safari'
670
790
  family_replacement: 'Mobile Safari'
671
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile'
672
- family_replacement: 'Mobile Safari UI/WKWebView'
673
- - regex: '(iPod|iPhone|iPad).* Safari'
674
- family_replacement: 'Mobile Safari'
675
- - regex: '(iPod|iPhone|iPad)'
791
+ - regex: '(iPod|iPod touch|iPhone|iPad)'
676
792
  family_replacement: 'Mobile Safari UI/WKWebView'
677
793
  - regex: '(Watch)(\d+),(\d+)'
678
794
  family_replacement: 'Apple $1 App'
@@ -721,9 +837,9 @@ user_agent_parsers:
721
837
  - regex: '(Nokia)[EN]?(\d+)'
722
838
 
723
839
  # BlackBerry devices
724
- - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
840
+ - regex: '(PlayBook).{1,200}RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
725
841
  family_replacement: 'BlackBerry WebKit'
726
- - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
842
+ - regex: '(Black[bB]erry|BB10).{1,200}Version/(\d+)\.(\d+)\.(\d+)'
727
843
  family_replacement: 'BlackBerry WebKit'
728
844
  - regex: '(Black[bB]erry)\s?(\d+)'
729
845
  family_replacement: 'BlackBerry'
@@ -743,18 +859,15 @@ user_agent_parsers:
743
859
 
744
860
  - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
745
861
 
746
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
747
- # family_replacement: 'iPad'
748
-
749
862
  # Phantomjs, should go before Safari
750
863
  - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
751
864
 
752
865
  # WebKit Nightly
753
- - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
866
+ - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .{0,200} Safari'
754
867
  family_replacement: 'WebKit Nightly'
755
868
 
756
869
  # Safari
757
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
870
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).{0,100}Safari/'
758
871
  family_replacement: 'Safari'
759
872
  # Safari didn't provide "Version/d.d.d" prior to 3.0
760
873
  - regex: '(Safari)/\d+'
@@ -803,6 +916,7 @@ user_agent_parsers:
803
916
  - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
804
917
  - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
805
918
 
919
+
806
920
  - regex: '([MS]?IE) (\d+)\.(\d+)'
807
921
  family_replacement: 'IE'
808
922
 
@@ -810,13 +924,61 @@ user_agent_parsers:
810
924
  family_replacement: 'Python Requests'
811
925
 
812
926
  # headless user-agents
813
- - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
927
+ - regex: '\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got|CloudCockpitBackend|ReactorNetty|axios|Jersey|Vert.x-WebClient|Apache-CXF|Go-CF-client|go-resty|AHC)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
928
+
929
+ # CloudFoundry
930
+ - regex: '^(cf)\/(\d+)\.(\d+)\.(\S+)'
931
+ family_replacement: 'CloudFoundry'
932
+
933
+ # SAP Leonardo
934
+ - regex: '^(sap-leonardo-iot-sdk-nodejs) \/ (\d+)\.(\d+)\.(\d+)'
935
+
936
+ # SAP Netweaver Application Server
937
+ - regex: '^(SAP NetWeaver Application Server) \(1.0;(\d{1})(\d{2})\)'
814
938
 
815
- - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
939
+ # HttpClient
940
+ - regex: '^(\w+-HTTPClient)\/(\d+)\.(\d+)-(\S+)'
941
+ family_replacement: 'HTTPClient'
942
+
943
+ # go-cli
944
+ - regex: '^(go-cli)\s(\d+)\.(\d+).(\S+)'
945
+
946
+ # Other Clients with the pattern <Name>/[v]<Major>.<Minor>[.<Patch>]
947
+ - regex: '^(Java-EurekaClient|Java-EurekaClient-Replication|HTTPClient|lua-resty-http)\/v?(\d+)\.(\d+)\.?(\d*)'
948
+
949
+ ## Clints with the pattern <Name>
950
+ - regex: '^(ping-service|sap xsuaa|Node-oauth|Site24x7|SAP CPI|JAEGER_SECURITY)'
951
+
952
+ # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
953
+ - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
954
+ family_replacement: 'Python aiohttp'
955
+
956
+ - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
957
+
958
+ # minio-go (https://github.com/minio/minio-go)
959
+ - regex: '(minio-go)/v(\d+)\.(\d+)\.(\d+)'
960
+
961
+ # ureq - minimal request library in rust (https://github.com/algesten/ureq)
962
+ - regex: '^(ureq)[/ ](\d+)\.(\d+).(\d+)'
963
+
964
+ # http.rb - HTTP (The Gem! a.k.a. http.rb) - a fast Ruby HTTP client
965
+ # (https://github.com/httprb/http/blob/3aa7470288deb81f7d7b982c1e2381871049dcbb/lib/http/request.rb#L27)
966
+ - regex: '^(http\.rb)/(\d+)\.(\d+).(\d+)'
967
+
968
+ # Guzzle, PHP HTTP client (https://docs.guzzlephp.org/)
969
+ - regex: '^(GuzzleHttp)/(\d+)\.(\d+).(\d+)'
970
+
971
+ # lorien/grab - Web Scraping Framework (https://github.com/lorien/grab)
972
+ - regex: '^(grab)\b'
816
973
 
817
974
  # Cloud Storage Clients
818
975
  - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
819
- - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
976
+ - regex: '^(S3 Browser) (\d+)[.-](\d+)[.-](\d+)(?:\s*https?://s3browser\.com|)'
977
+ - regex: '(S3Gof3r)'
978
+ # IBM COS (Cloud Object Storage) API
979
+ - regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
980
+ # rusoto - Rusoto - AWS SDK for Rust - https://github.com/rusoto/rusoto
981
+ - regex: '^(rusoto)/(\d+)\.(\d+)\.(\d+)'
820
982
  # rclone - rsync for cloud storage - https://rclone.org/
821
983
  - regex: '^(rclone)/v(\d+)\.(\d+)'
822
984
 
@@ -834,6 +996,15 @@ user_agent_parsers:
834
996
  - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
835
997
  family_replacement: 'ViaFree'
836
998
 
999
+ # Transmit (https://library.panic.com/transmit/)
1000
+ - regex: '(Transmit)/(\d+)\.(\d+)\.(\d+)'
1001
+
1002
+ # Download Master (https://downloadmaster.ru/)
1003
+ - regex: '(Download Master)'
1004
+
1005
+ # HTTrack crawler
1006
+ - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)'
1007
+
837
1008
  os_parsers:
838
1009
  ##########
839
1010
  # HbbTV vendors
@@ -849,7 +1020,7 @@ os_parsers:
849
1020
  # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
850
1021
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
851
1022
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
852
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
1023
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.{0,200};.{0,200}; ([0-9]{4});\)'
853
1024
 
854
1025
 
855
1026
  # LG is consistent too, but we need to add manually the year model
@@ -869,9 +1040,9 @@ os_parsers:
869
1040
  os_replacement: 'Samsung'
870
1041
  os_v1_replacement: '2011'
871
1042
  # manage the two models of 2013
872
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
1043
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}FXPDEUC'
873
1044
  os_v2_replacement: 'UE40F7000'
874
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
1045
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}MST12DEUC'
875
1046
  os_v2_replacement: 'UE32F4500'
876
1047
  # generic Samsung (works starting in 2012)
877
1048
  #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
@@ -879,22 +1050,26 @@ os_parsers:
879
1050
  # Philips : not found any other way than a manual mapping
880
1051
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/4.1.3 PHILIPSTV/1.1.1; en) Presto/2.10.250 Version/11.60
881
1052
  # Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70
882
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
1053
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/4'
883
1054
  os_v1_replacement: '2013'
884
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
1055
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/3'
885
1056
  os_v1_replacement: '2012'
886
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
1057
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/2'
887
1058
  os_v1_replacement: '2011'
888
1059
 
889
1060
  # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
890
- - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
1061
+ - regex: 'HbbTV/\d+\.\d+\.\d+.{0,100}(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
891
1062
  os_replacement: 'FireHbbTV'
892
1063
 
893
1064
  # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
894
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
1065
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\)'
1066
+
1067
+ # aspiegel.com spider (owned by Huawei)
1068
+ - regex: 'AspiegelBot'
1069
+ os_replacement: 'Other'
895
1070
 
896
1071
  ##########
897
- # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
1072
+ # @note: Windows Phone needs to come before Windows NT 6.1 {0,2}and* before Android to catch cases such as:
898
1073
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
899
1074
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
900
1075
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
@@ -903,10 +1078,16 @@ os_parsers:
903
1078
 
904
1079
  - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
905
1080
 
906
- # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
907
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
1081
+ # Again a MS-special one: iPhone.{0,200}Outlook-iOS-Android/x.x is erroneously detected as Android
1082
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).{0,100}Outlook-iOS-Android'
908
1083
  os_replacement: 'iOS'
909
1084
 
1085
+ # Special case for old ArcGIS Mobile products
1086
+ - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]{1,50}|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1087
+
1088
+ # Special case for new ArcGIS Mobile products
1089
+ - regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
1090
+
910
1091
  ##########
911
1092
  # Android
912
1093
  # can actually detect rooted android os. do we care?
@@ -932,15 +1113,18 @@ os_parsers:
932
1113
  - regex: '(Android) Honeycomb'
933
1114
  os_v1_replacement: '3'
934
1115
 
1116
+ # Android 9; Android 10;
1117
+ - regex: '(Android) (\d+);'
1118
+
935
1119
  # UCWEB
936
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
1120
+ - regex: '^UCWEB.{0,200}; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]{1,100})|);'
937
1121
  os_replacement: 'Android'
938
- - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1122
+ - regex: '^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
939
1123
  os_replacement: 'iOS'
940
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1124
+ - regex: '^UCWEB.{0,200}; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
941
1125
  os_replacement: 'Windows Phone'
942
1126
  # JUC
943
- - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
1127
+ - regex: '^(JUC).{0,200}; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]{1,100})|)'
944
1128
  os_replacement: 'Android'
945
1129
 
946
1130
  # Salesforce
@@ -958,7 +1142,7 @@ os_parsers:
958
1142
  # properly identify as Chrome OS
959
1143
  #
960
1144
  # ex: Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp
961
- - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
1145
+ - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$'
962
1146
  os_replacement: 'Chrome OS'
963
1147
 
964
1148
  ##########
@@ -987,11 +1171,11 @@ os_parsers:
987
1171
  os_replacement: 'Windows'
988
1172
  os_v1_replacement: 'XP'
989
1173
 
990
- - regex: '(Windows NT 6\.1)'
1174
+ - regex: '(Win(?:dows NT |32NT\/)6\.1)'
991
1175
  os_replacement: 'Windows'
992
1176
  os_v1_replacement: '7'
993
1177
 
994
- - regex: '(Windows NT 6\.0)'
1178
+ - regex: '(Win(?:dows NT |32NT\/)6\.0)'
995
1179
  os_replacement: 'Windows'
996
1180
  os_v1_replacement: 'Vista'
997
1181
 
@@ -1003,7 +1187,7 @@ os_parsers:
1003
1187
  os_replacement: 'Windows'
1004
1188
  os_v1_replacement: 'RT'
1005
1189
 
1006
- - regex: '(Windows NT 6\.2)'
1190
+ - regex: '(Win(?:dows NT |32NT\/)6\.2)'
1007
1191
  os_replacement: 'Windows'
1008
1192
  os_v1_replacement: '8'
1009
1193
 
@@ -1012,12 +1196,12 @@ os_parsers:
1012
1196
  os_v1_replacement: 'RT 8'
1013
1197
  os_v2_replacement: '1'
1014
1198
 
1015
- - regex: '(Windows NT 6\.3)'
1199
+ - regex: '(Win(?:dows NT |32NT\/)6\.3)'
1016
1200
  os_replacement: 'Windows'
1017
1201
  os_v1_replacement: '8'
1018
1202
  os_v2_replacement: '1'
1019
1203
 
1020
- - regex: '(Windows NT 6\.4)'
1204
+ - regex: '(Win(?:dows NT |32NT\/)6\.4)'
1021
1205
  os_replacement: 'Windows'
1022
1206
  os_v1_replacement: '10'
1023
1207
 
@@ -1050,7 +1234,7 @@ os_parsers:
1050
1234
  os_v1_replacement: '95'
1051
1235
 
1052
1236
  # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads
1053
- - regex: '^Box.*Windows/([\d.]+);'
1237
+ - regex: '^Box.{0,200}Windows/([\d.]+);'
1054
1238
  os_replacement: 'Windows'
1055
1239
  os_v1_replacement: '$1'
1056
1240
 
@@ -1067,33 +1251,33 @@ os_parsers:
1067
1251
  ##########
1068
1252
  - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
1069
1253
  os_replacement: 'Mac OS X'
1070
- - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
1254
+ - regex: 'Mac OS X\s.{1,50}\s(\d+).(\d+).(\d+)'
1071
1255
  os_replacement: 'Mac OS X'
1072
1256
  os_v1_replacement: '$1'
1073
1257
  os_v2_replacement: '$2'
1074
1258
  os_v3_replacement: '$3'
1075
1259
  # Leopard
1076
- - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
1260
+ - regex: ' (Dar)(win)/(9).(\d+).{0,100}\((?:i386|x86_64|Power Macintosh)\)'
1077
1261
  os_replacement: 'Mac OS X'
1078
1262
  os_v1_replacement: '10'
1079
1263
  os_v2_replacement: '5'
1080
1264
  # Snow Leopard
1081
- - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
1265
+ - regex: ' (Dar)(win)/(10).(\d+).{0,100}\((?:i386|x86_64)\)'
1082
1266
  os_replacement: 'Mac OS X'
1083
1267
  os_v1_replacement: '10'
1084
1268
  os_v2_replacement: '6'
1085
1269
  # Lion
1086
- - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
1270
+ - regex: ' (Dar)(win)/(11).(\d+).{0,100}\((?:i386|x86_64)\)'
1087
1271
  os_replacement: 'Mac OS X'
1088
1272
  os_v1_replacement: '10'
1089
1273
  os_v2_replacement: '7'
1090
1274
  # Mountain Lion
1091
- - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
1275
+ - regex: ' (Dar)(win)/(12).(\d+).{0,100}\((?:i386|x86_64)\)'
1092
1276
  os_replacement: 'Mac OS X'
1093
1277
  os_v1_replacement: '10'
1094
1278
  os_v2_replacement: '8'
1095
1279
  # Mavericks
1096
- - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
1280
+ - regex: ' (Dar)(win)/(13).(\d+).{0,100}\((?:i386|x86_64)\)'
1097
1281
  os_replacement: 'Mac OS X'
1098
1282
  os_v1_replacement: '10'
1099
1283
  os_v2_replacement: '9'
@@ -1110,7 +1294,7 @@ os_parsers:
1110
1294
  - regex: '(?:PPC|Intel) (Mac OS X)'
1111
1295
 
1112
1296
  # Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
1113
- - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1297
+ - regex: '^Box.{0,200};(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1114
1298
  os_replacement: 'Mac OS X'
1115
1299
 
1116
1300
  ##########
@@ -1121,7 +1305,7 @@ os_parsers:
1121
1305
  - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
1122
1306
  os_replacement: 'ATV OS X'
1123
1307
 
1124
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1308
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1125
1309
  os_replacement: 'iOS'
1126
1310
 
1127
1311
  # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
@@ -1129,15 +1313,15 @@ os_parsers:
1129
1313
  os_replacement: 'iOS'
1130
1314
 
1131
1315
  # few more stragglers
1132
- - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
1316
+ - regex: '(iPhone|iPad|iPod).{0,100}Mac OS X.{0,100}Version/(\d+)\.(\d+)'
1133
1317
  os_replacement: 'iOS'
1134
1318
 
1135
1319
  # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
1136
1320
  # whether the os maps to Mac OS, or iOS, or just Darwin.
1137
1321
  # See: http://user-agents.me/cfnetwork-version-list
1138
- - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
1322
+ - regex: '(CFNetwork)/(5)48\.0\.3.{0,100} Darwin/11\.0\.0'
1139
1323
  os_replacement: 'iOS'
1140
- - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
1324
+ - regex: '(CFNetwork)/(5)48\.(0)\.4.{0,100} Darwin/(1)1\.0\.0'
1141
1325
  os_replacement: 'iOS'
1142
1326
  - regex: '(CFNetwork)/(5)48\.(1)\.4'
1143
1327
  os_replacement: 'iOS'
@@ -1172,17 +1356,17 @@ os_parsers:
1172
1356
  os_replacement: 'Mac OS X'
1173
1357
  os_v1_replacement: '10'
1174
1358
  os_v2_replacement: '11'
1175
- - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+'
1359
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.4\.\d+'
1176
1360
  os_replacement: 'iOS'
1177
1361
  os_v1_replacement: '9'
1178
1362
  os_v2_replacement: '3'
1179
1363
  os_v3_replacement: '1'
1180
- - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+'
1364
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.5\.\d+'
1181
1365
  os_replacement: 'iOS'
1182
1366
  os_v1_replacement: '9'
1183
1367
  os_v2_replacement: '3'
1184
1368
  os_v3_replacement: '2'
1185
- - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+'
1369
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.6\.\d+'
1186
1370
  os_replacement: 'iOS'
1187
1371
  os_v1_replacement: '9'
1188
1372
  os_v2_replacement: '3'
@@ -1203,15 +1387,15 @@ os_parsers:
1203
1387
  # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
1204
1388
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1205
1389
  ##########
1206
- - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)'
1390
+ - regex: 'CFNetwork/.{0,100} Darwin/17\.\d+.{0,100}\(x86_64\)'
1207
1391
  os_replacement: 'Mac OS X'
1208
1392
  os_v1_replacement: '10'
1209
1393
  os_v2_replacement: '13'
1210
- - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
1394
+ - regex: 'CFNetwork/.{0,100} Darwin/16\.\d+.{0,100}\(x86_64\)'
1211
1395
  os_replacement: 'Mac OS X'
1212
1396
  os_v1_replacement: '10'
1213
1397
  os_v2_replacement: '12'
1214
- - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
1398
+ - regex: 'CFNetwork/8.{0,100} Darwin/15\.\d+.{0,100}\(x86_64\)'
1215
1399
  os_replacement: 'Mac OS X'
1216
1400
  os_v1_replacement: '10'
1217
1401
  os_v2_replacement: '11'
@@ -1219,87 +1403,146 @@ os_parsers:
1219
1403
  # CFNetwork iOS Apps
1220
1404
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1221
1405
  ##########
1222
- - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
1406
+ - regex: 'CFNetwork/.{0,100} Darwin/(9)\.\d+'
1223
1407
  os_replacement: 'iOS'
1224
1408
  os_v1_replacement: '1'
1225
- - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
1409
+ - regex: 'CFNetwork/.{0,100} Darwin/(10)\.\d+'
1226
1410
  os_replacement: 'iOS'
1227
1411
  os_v1_replacement: '4'
1228
- - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
1412
+ - regex: 'CFNetwork/.{0,100} Darwin/(11)\.\d+'
1229
1413
  os_replacement: 'iOS'
1230
1414
  os_v1_replacement: '5'
1231
- - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
1415
+ - regex: 'CFNetwork/.{0,100} Darwin/(13)\.\d+'
1232
1416
  os_replacement: 'iOS'
1233
1417
  os_v1_replacement: '6'
1234
- - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
1418
+ - regex: 'CFNetwork/6.{0,100} Darwin/(14)\.\d+'
1235
1419
  os_replacement: 'iOS'
1236
1420
  os_v1_replacement: '7'
1237
- - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
1421
+ - regex: 'CFNetwork/7.{0,100} Darwin/(14)\.\d+'
1238
1422
  os_replacement: 'iOS'
1239
1423
  os_v1_replacement: '8'
1240
1424
  os_v2_replacement: '0'
1241
- - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
1425
+ - regex: 'CFNetwork/7.{0,100} Darwin/(15)\.\d+'
1242
1426
  os_replacement: 'iOS'
1243
1427
  os_v1_replacement: '9'
1244
1428
  os_v2_replacement: '0'
1245
- - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+'
1429
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.5\.\d+'
1246
1430
  os_replacement: 'iOS'
1247
1431
  os_v1_replacement: '10'
1248
1432
  os_v2_replacement: '3'
1249
- - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+'
1433
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.6\.\d+'
1250
1434
  os_replacement: 'iOS'
1251
1435
  os_v1_replacement: '10'
1252
1436
  os_v2_replacement: '3'
1253
1437
  os_v3_replacement: '2'
1254
- - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+'
1438
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.7\.\d+'
1255
1439
  os_replacement: 'iOS'
1256
1440
  os_v1_replacement: '10'
1257
1441
  os_v2_replacement: '3'
1258
1442
  os_v3_replacement: '3'
1259
- - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
1443
+ - regex: 'CFNetwork/8.{0,100} Darwin/(16)\.\d+'
1260
1444
  os_replacement: 'iOS'
1261
1445
  os_v1_replacement: '10'
1262
- - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+'
1446
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.0\.\d+'
1263
1447
  os_replacement: 'iOS'
1264
1448
  os_v1_replacement: '11'
1265
1449
  os_v2_replacement: '0'
1266
- - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+'
1450
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.2\.\d+'
1267
1451
  os_replacement: 'iOS'
1268
1452
  os_v1_replacement: '11'
1269
1453
  os_v2_replacement: '1'
1270
- - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+'
1454
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.3\.\d+'
1271
1455
  os_replacement: 'iOS'
1272
1456
  os_v1_replacement: '11'
1273
1457
  os_v2_replacement: '2'
1274
- - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+'
1458
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.4\.\d+'
1275
1459
  os_replacement: 'iOS'
1276
1460
  os_v1_replacement: '11'
1277
1461
  os_v2_replacement: '2'
1278
1462
  os_v3_replacement: '6'
1279
- - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+'
1463
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.5\.\d+'
1280
1464
  os_replacement: 'iOS'
1281
1465
  os_v1_replacement: '11'
1282
1466
  os_v2_replacement: '3'
1283
- - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+'
1467
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.6\.\d+'
1284
1468
  os_replacement: 'iOS'
1285
1469
  os_v1_replacement: '11'
1286
1470
  os_v2_replacement: '4'
1287
- - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+'
1471
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.7\.\d+'
1288
1472
  os_replacement: 'iOS'
1289
1473
  os_v1_replacement: '11'
1290
1474
  os_v2_replacement: '4'
1291
1475
  os_v3_replacement: '1'
1292
- - regex: 'CFNetwork/8.* Darwin/(17)\.\d+'
1476
+ - regex: 'CFNetwork/8.{0,100} Darwin/(17)\.\d+'
1293
1477
  os_replacement: 'iOS'
1294
1478
  os_v1_replacement: '11'
1295
- - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+'
1479
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.0\.\d+'
1296
1480
  os_replacement: 'iOS'
1297
1481
  os_v1_replacement: '12'
1298
1482
  os_v2_replacement: '0'
1299
- - regex: 'CFNetwork/9.* Darwin/(18)\.\d+'
1483
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.2\.\d+'
1300
1484
  os_replacement: 'iOS'
1301
1485
  os_v1_replacement: '12'
1302
- - regex: 'CFNetwork/.* Darwin/'
1486
+ os_v2_replacement: '1'
1487
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.5\.\d+'
1488
+ os_replacement: 'iOS'
1489
+ os_v1_replacement: '12'
1490
+ os_v2_replacement: '2'
1491
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.6\.\d+'
1492
+ os_replacement: 'iOS'
1493
+ os_v1_replacement: '12'
1494
+ os_v2_replacement: '3'
1495
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.7\.\d+'
1496
+ os_replacement: 'iOS'
1497
+ os_v1_replacement: '12'
1498
+ os_v2_replacement: '4'
1499
+ - regex: 'CFNetwork/9.{0,100} Darwin/(18)\.\d+'
1500
+ os_replacement: 'iOS'
1501
+ os_v1_replacement: '12'
1502
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.2\.\d+'
1503
+ os_replacement: 'iOS'
1504
+ os_v1_replacement: '13'
1505
+ os_v2_replacement: '3'
1506
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.3\.\d+'
1507
+ os_replacement: 'iOS'
1508
+ os_v1_replacement: '13'
1509
+ os_v2_replacement: '3'
1510
+ os_v3_replacement: '1'
1511
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.4\.\d+'
1512
+ os_replacement: 'iOS'
1513
+ os_v1_replacement: '13'
1514
+ os_v2_replacement: '4'
1515
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.5\.\d+'
1516
+ os_replacement: 'iOS'
1517
+ os_v1_replacement: '13'
1518
+ os_v2_replacement: '5'
1519
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.6\.\d+'
1520
+ os_replacement: 'iOS'
1521
+ os_v1_replacement: '13'
1522
+ os_v2_replacement: '6'
1523
+ - regex: 'CFNetwork/1[01].{0,100} Darwin/19\.\d+'
1524
+ os_replacement: 'iOS'
1525
+ os_v1_replacement: '13'
1526
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.1\.\d+'
1527
+ os_replacement: 'iOS'
1528
+ os_v1_replacement: '14'
1529
+ os_v2_replacement: '2'
1530
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.2\.\d+'
1531
+ os_replacement: 'iOS'
1532
+ os_v1_replacement: '14'
1533
+ os_v2_replacement: '3'
1534
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.3\.\d+'
1535
+ os_replacement: 'iOS'
1536
+ os_v1_replacement: '14'
1537
+ os_v2_replacement: '4'
1538
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.4\.\d+'
1539
+ os_replacement: 'iOS'
1540
+ os_v1_replacement: '14'
1541
+ os_v2_replacement: '5'
1542
+ - regex: 'CFNetwork/.{0,100} Darwin/(20)\.\d+'
1543
+ os_replacement: 'iOS'
1544
+ os_v1_replacement: '14'
1545
+ - regex: 'CFNetwork/.{0,100} Darwin/'
1303
1546
  os_replacement: 'iOS'
1304
1547
 
1305
1548
  # iOS Apps
@@ -1353,9 +1596,9 @@ os_parsers:
1353
1596
  ##########
1354
1597
  - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
1355
1598
  os_replacement: 'Symbian OS'
1356
- - regex: '(Symbian/3).+NokiaBrowser/7\.3'
1599
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.3'
1357
1600
  os_replacement: 'Symbian^3 Anna'
1358
- - regex: '(Symbian/3).+NokiaBrowser/7\.4'
1601
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.4'
1359
1602
  os_replacement: 'Symbian^3 Belle'
1360
1603
  - regex: '(Symbian/3)'
1361
1604
  os_replacement: 'Symbian^3'
@@ -1372,11 +1615,11 @@ os_parsers:
1372
1615
  ##########
1373
1616
  # BlackBerry devices
1374
1617
  ##########
1375
- - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
1618
+ - regex: '(BB10);.{1,200}Version/(\d+)\.(\d+)\.(\d+)'
1376
1619
  os_replacement: 'BlackBerry OS'
1377
1620
  - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1378
1621
  os_replacement: 'BlackBerry OS'
1379
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1622
+ - regex: '(Black[Bb]erry).{1,200}Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1380
1623
  os_replacement: 'BlackBerry OS'
1381
1624
  - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
1382
1625
  os_replacement: 'BlackBerry Tablet OS'
@@ -1385,47 +1628,53 @@ os_parsers:
1385
1628
  - regex: '(Black[Bb]erry)'
1386
1629
  os_replacement: 'BlackBerry OS'
1387
1630
 
1631
+ ##########
1632
+ # KaiOS
1633
+ ##########
1634
+ - regex: '(K[Aa][Ii]OS)\/(\d+)\.(\d+)(?:\.(\d+)|)'
1635
+ os_replacement: 'KaiOS'
1636
+
1388
1637
  ##########
1389
1638
  # Firefox OS
1390
1639
  ##########
1391
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
1640
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.0 Firefox/\d+\.\d+'
1392
1641
  os_replacement: 'Firefox OS'
1393
1642
  os_v1_replacement: '1'
1394
1643
  os_v2_replacement: '0'
1395
1644
  os_v3_replacement: '1'
1396
1645
 
1397
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
1646
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.1 Firefox/\d+\.\d+'
1398
1647
  os_replacement: 'Firefox OS'
1399
1648
  os_v1_replacement: '1'
1400
1649
  os_v2_replacement: '1'
1401
1650
 
1402
- - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
1651
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/26.0 Firefox/\d+\.\d+'
1403
1652
  os_replacement: 'Firefox OS'
1404
1653
  os_v1_replacement: '1'
1405
1654
  os_v2_replacement: '2'
1406
1655
 
1407
- - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
1656
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/28.0 Firefox/\d+\.\d+'
1408
1657
  os_replacement: 'Firefox OS'
1409
1658
  os_v1_replacement: '1'
1410
1659
  os_v2_replacement: '3'
1411
1660
 
1412
- - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
1661
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/30.0 Firefox/\d+\.\d+'
1413
1662
  os_replacement: 'Firefox OS'
1414
1663
  os_v1_replacement: '1'
1415
1664
  os_v2_replacement: '4'
1416
1665
 
1417
- - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
1666
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/32.0 Firefox/\d+\.\d+'
1418
1667
  os_replacement: 'Firefox OS'
1419
1668
  os_v1_replacement: '2'
1420
1669
  os_v2_replacement: '0'
1421
1670
 
1422
- - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
1671
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\d+\.\d+'
1423
1672
  os_replacement: 'Firefox OS'
1424
1673
  os_v1_replacement: '2'
1425
1674
  os_v2_replacement: '1'
1426
1675
 
1427
1676
  # Firefox OS Generic
1428
- - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
1677
+ - regex: '\((?:Mobile|Tablet);.{1,200}Firefox/\d+\.\d+'
1429
1678
  os_replacement: 'Firefox OS'
1430
1679
 
1431
1680
 
@@ -1467,7 +1716,7 @@ os_parsers:
1467
1716
  - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
1468
1717
 
1469
1718
  # Gentoo Linux + Kernel Version
1470
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
1719
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).{0,100}gentoo'
1471
1720
  os_replacement: 'Gentoo'
1472
1721
 
1473
1722
  # Opera Mini Bada
@@ -1487,6 +1736,8 @@ os_parsers:
1487
1736
  os_replacement: 'Red Hat'
1488
1737
  - regex: '\((freebsd)(\d+)\.(\d+)\)'
1489
1738
  os_replacement: 'FreeBSD'
1739
+ - regex: 'linux'
1740
+ os_replacement: 'Linux'
1490
1741
 
1491
1742
  # Roku Digital-Video-Players https://www.roku.com/
1492
1743
  - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
@@ -1497,19 +1748,19 @@ device_parsers:
1497
1748
  # Mobile Spiders
1498
1749
  # Catch the mobile crawler before checking for iPhones / Androids.
1499
1750
  #########
1500
- - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
1751
+ - regex: '^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.{0,200}iPhone)'
1501
1752
  regex_flag: 'i'
1502
1753
  device_replacement: 'Spider'
1503
1754
  brand_replacement: 'Spider'
1504
1755
  model_replacement: 'Smartphone'
1505
- - regex: '(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
1756
+ - regex: '^.{0,100}?(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).{0,200}(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
1506
1757
  regex_flag: 'i'
1507
1758
  device_replacement: 'Spider'
1508
1759
  brand_replacement: 'Spider'
1509
1760
  model_replacement: 'Feature Phone'
1510
1761
 
1511
1762
  # PTST / WebPageTest.org crawlers
1512
- - regex: ' PTST/\d+(?:\.)?\d+$'
1763
+ - regex: ' PTST/\d+(?:\.\d+|)$'
1513
1764
  device_replacement: 'Spider'
1514
1765
  brand_replacement: 'Spider'
1515
1766
 
@@ -1518,11 +1769,21 @@ device_parsers:
1518
1769
  device_replacement: 'Spider'
1519
1770
  brand_replacement: 'Spider'
1520
1771
 
1772
+ # aspiegel.com spider (owned by Huawei)
1773
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
1774
+ device_replacement: 'Spider'
1775
+ brand_replacement: 'Spider'
1776
+ model_replacement: 'Smartphone'
1777
+ - regex: 'Mozilla.{0,200}AspiegelBot'
1778
+ device_replacement: 'Spider'
1779
+ brand_replacement: 'Spider'
1780
+ model_replacement: 'Desktop'
1781
+
1521
1782
  #########
1522
1783
  # WebBrowser for SmartWatch
1523
1784
  # @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
1524
1785
  #########
1525
- - regex: '\bSmartWatch *\( *([^;]+) *; *([^;]+) *;'
1786
+ - regex: '\bSmartWatch {0,2}\( {0,2}([^;]{1,200}) {0,2}; {0,2}([^;]{1,200}) {0,2};'
1526
1787
  device_replacement: '$1 $2'
1527
1788
  brand_replacement: '$1'
1528
1789
  model_replacement: '$2'
@@ -1534,16 +1795,16 @@ device_parsers:
1534
1795
  ######################################################################
1535
1796
 
1536
1797
  # Android Application
1537
- - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
1798
+ - regex: 'Android Application[^\-]{1,300} - (Sony) ?(Ericsson|) (.{1,200}) \w{1,20} - '
1538
1799
  device_replacement: '$1 $2'
1539
1800
  brand_replacement: '$1$2'
1540
1801
  model_replacement: '$3'
1541
- - regex: 'Android Application[^\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.+) \w+ - '
1802
+ - regex: 'Android Application[^\-]{1,300} - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.{1,200}) \w{1,20} - '
1542
1803
  regex_flag: 'i'
1543
1804
  device_replacement: '$1 $2'
1544
1805
  brand_replacement: '$1'
1545
1806
  model_replacement: '$2'
1546
- - regex: 'Android Application[^\-]+ - ([^ ]+) (.+) \w+ - '
1807
+ - regex: 'Android Application[^\-]{1,300} - ([^ ]+) (.{1,200}) \w{1,20} - '
1547
1808
  device_replacement: '$1 $2'
1548
1809
  brand_replacement: '$1'
1549
1810
  model_replacement: '$2'
@@ -1552,11 +1813,11 @@ device_parsers:
1552
1813
  # 3Q
1553
1814
  # @ref: http://www.3q-int.com/
1554
1815
  #########
1555
- - regex: '; *([BLRQ]C\d{4}[A-Z]+) +Build/'
1816
+ - regex: '; {0,2}([BLRQ]C\d{4}[A-Z]{1,100}?)(?: Build|\) AppleWebKit)'
1556
1817
  device_replacement: '3Q $1'
1557
1818
  brand_replacement: '3Q'
1558
1819
  model_replacement: '$1'
1559
- - regex: '; *(?:3Q_)([^;/]+) +Build'
1820
+ - regex: '; {0,2}(?:3Q_)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1560
1821
  device_replacement: '3Q $1'
1561
1822
  brand_replacement: '3Q'
1562
1823
  model_replacement: '$1'
@@ -1565,19 +1826,19 @@ device_parsers:
1565
1826
  # Acer
1566
1827
  # @ref: http://us.acer.com/ac/en/US/content/group/tablets
1567
1828
  #########
1568
- - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+) Build'
1829
+ - regex: 'Android [34].{0,200}; {0,2}(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1569
1830
  device_replacement: '$1'
1570
1831
  brand_replacement: 'Acer'
1571
1832
  model_replacement: '$1'
1572
- - regex: '; *Acer Iconia Tab ([^;/]+) Build'
1833
+ - regex: '; {0,2}Acer Iconia Tab ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1573
1834
  device_replacement: '$1'
1574
1835
  brand_replacement: 'Acer'
1575
1836
  model_replacement: '$1'
1576
- - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+) Build'
1837
+ - regex: '; {0,2}(Z1[1235]0|E320[^/]{0,10}|S500|S510|Liquid[^;/]{0,30}|Iconia A\d+)(?: Build|\) AppleWebKit)'
1577
1838
  device_replacement: '$1'
1578
1839
  brand_replacement: 'Acer'
1579
1840
  model_replacement: '$1'
1580
- - regex: '; *(Acer |ACER )([^;/]+) Build'
1841
+ - regex: '; {0,2}(Acer |ACER )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1581
1842
  device_replacement: '$1$2'
1582
1843
  brand_replacement: 'Acer'
1583
1844
  model_replacement: '$2'
@@ -1588,7 +1849,7 @@ device_parsers:
1588
1849
  # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
1589
1850
  # custom ROM builds for Vega
1590
1851
  #########
1591
- - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).* Build'
1852
+ - regex: '; {0,2}(Advent |)(Vega(?:Bean|Comb|)).{0,200}?(?: Build|\) AppleWebKit)'
1592
1853
  device_replacement: '$1$2'
1593
1854
  brand_replacement: 'Advent'
1594
1855
  model_replacement: '$2'
@@ -1597,7 +1858,7 @@ device_parsers:
1597
1858
  # Ainol
1598
1859
  # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
1599
1860
  #########
1600
- - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+) Build'
1861
+ - regex: '; {0,2}(Ainol |)((?:NOVO|[Nn]ovo)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1601
1862
  device_replacement: '$1$2'
1602
1863
  brand_replacement: 'Ainol'
1603
1864
  model_replacement: '$2'
@@ -1606,12 +1867,12 @@ device_parsers:
1606
1867
  # Airis
1607
1868
  # @ref: http://airis.es/Tienda/Default.aspx?idG=001
1608
1869
  #########
1609
- - regex: '; *AIRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
1870
+ - regex: '; {0,2}AIRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
1610
1871
  regex_flag: 'i'
1611
1872
  device_replacement: '$1'
1612
1873
  brand_replacement: 'Airis'
1613
1874
  model_replacement: '$1'
1614
- - regex: '; *(OnePAD[^;/]+) Build'
1875
+ - regex: '; {0,2}(OnePAD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1615
1876
  regex_flag: 'i'
1616
1877
  device_replacement: '$1'
1617
1878
  brand_replacement: 'Airis'
@@ -1621,7 +1882,7 @@ device_parsers:
1621
1882
  # Airpad
1622
1883
  # @ref: ??
1623
1884
  #########
1624
- - regex: '; *Airpad[ \-]([^;/]+) Build'
1885
+ - regex: '; {0,2}Airpad[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1625
1886
  device_replacement: 'Airpad $1'
1626
1887
  brand_replacement: 'Airpad'
1627
1888
  model_replacement: '$1'
@@ -1630,29 +1891,29 @@ device_parsers:
1630
1891
  # Alcatel - TCT
1631
1892
  # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
1632
1893
  #########
1633
- - regex: '; *(one ?touch) (EVO7|T10|T20) Build'
1894
+ - regex: '; {0,2}(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1634
1895
  device_replacement: 'Alcatel One Touch $2'
1635
1896
  brand_replacement: 'Alcatel'
1636
1897
  model_replacement: 'One Touch $2'
1637
- - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);? Build'
1898
+ - regex: '; {0,2}(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1638
1899
  regex_flag: 'i'
1639
1900
  device_replacement: 'Alcatel One Touch $1'
1640
1901
  brand_replacement: 'Alcatel'
1641
1902
  model_replacement: 'One Touch $1'
1642
- - regex: '; *(TCL)[ _]([^;/]+) Build'
1903
+ - regex: '; {0,2}(TCL)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1643
1904
  device_replacement: '$1 $2'
1644
1905
  brand_replacement: '$1'
1645
1906
  model_replacement: '$2'
1646
1907
  # operator specific models
1647
- - regex: '; *(Vodafone Smart II|Optimus_Madrid) Build'
1908
+ - regex: '; {0,2}(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1648
1909
  device_replacement: 'Alcatel $1'
1649
1910
  brand_replacement: 'Alcatel'
1650
1911
  model_replacement: '$1'
1651
- - regex: '; *BASE_Lutea_3 Build'
1912
+ - regex: '; {0,2}BASE_Lutea_3(?: Build|\) AppleWebKit)'
1652
1913
  device_replacement: 'Alcatel One Touch 998'
1653
1914
  brand_replacement: 'Alcatel'
1654
1915
  model_replacement: 'One Touch 998'
1655
- - regex: '; *BASE_Varia Build'
1916
+ - regex: '; {0,2}BASE_Varia(?: Build|\) AppleWebKit)'
1656
1917
  device_replacement: 'Alcatel One Touch 918D'
1657
1918
  brand_replacement: 'Alcatel'
1658
1919
  model_replacement: 'One Touch 918D'
@@ -1661,7 +1922,7 @@ device_parsers:
1661
1922
  # Allfine
1662
1923
  # @ref: http://www.myallfine.com/Products.asp
1663
1924
  #########
1664
- - regex: '; *((?:FINE|Fine)\d[^;/]+) Build'
1925
+ - regex: '; {0,2}((?:FINE|Fine)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1665
1926
  device_replacement: '$1'
1666
1927
  brand_replacement: 'Allfine'
1667
1928
  model_replacement: '$1'
@@ -1670,15 +1931,15 @@ device_parsers:
1670
1931
  # Allview
1671
1932
  # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
1672
1933
  #########
1673
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*) Build/'
1934
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).{0,200}?)(?: Build|\) AppleWebKit)'
1674
1935
  device_replacement: '$1$2'
1675
1936
  brand_replacement: 'Allview'
1676
1937
  model_replacement: '$2'
1677
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy) Build'
1938
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1678
1939
  device_replacement: '$1$2'
1679
1940
  brand_replacement: 'Allview'
1680
1941
  model_replacement: '$2'
1681
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*) Build'
1942
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1682
1943
  device_replacement: '$1$2'
1683
1944
  brand_replacement: 'Allview'
1684
1945
  model_replacement: '$2'
@@ -1688,11 +1949,11 @@ device_parsers:
1688
1949
  # @ref: http://www.allwinner.com/
1689
1950
  # @models: A31 (13.3"),A20,A10,
1690
1951
  #########
1691
- - regex: '; *(A13-MID) Build'
1952
+ - regex: '; {0,2}(A13-MID)(?: Build|\) AppleWebKit)'
1692
1953
  device_replacement: '$1'
1693
1954
  brand_replacement: 'Allwinner'
1694
1955
  model_replacement: '$1'
1695
- - regex: '; *(Allwinner)[ _\-]?([^;/]+) Build'
1956
+ - regex: '; {0,2}(Allwinner)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1696
1957
  device_replacement: '$1 $2'
1697
1958
  brand_replacement: 'Allwinner'
1698
1959
  model_replacement: '$1'
@@ -1701,7 +1962,7 @@ device_parsers:
1701
1962
  # Amaway
1702
1963
  # @ref: http://www.amaway.cn/
1703
1964
  #########
1704
- - regex: '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80) Build'
1965
+ - regex: '; {0,2}(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\) AppleWebKit)'
1705
1966
  device_replacement: '$1'
1706
1967
  brand_replacement: 'Amaway'
1707
1968
  model_replacement: '$1'
@@ -1710,11 +1971,11 @@ device_parsers:
1710
1971
  # Amoi
1711
1972
  # @ref: http://www.amoi.com/en/prd/prd_index.jspx
1712
1973
  #########
1713
- - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+) Build'
1974
+ - regex: '; {0,2}(?:AMOI|Amoi)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1714
1975
  device_replacement: 'Amoi $1'
1715
1976
  brand_replacement: 'Amoi'
1716
1977
  model_replacement: '$1'
1717
- - regex: '^(?:AMOI|Amoi)[ _]([^;/]+) Linux'
1978
+ - regex: '^(?:AMOI|Amoi)[ _]([^;/]{1,100}?) Linux'
1718
1979
  device_replacement: 'Amoi $1'
1719
1980
  brand_replacement: 'Amoi'
1720
1981
  model_replacement: '$1'
@@ -1723,7 +1984,7 @@ device_parsers:
1723
1984
  # Aoc
1724
1985
  # @ref: http://latin.aoc.com/media_tablet
1725
1986
  #########
1726
- - regex: '; *(MW(?:0[789]|10)[^;/]+) Build'
1987
+ - regex: '; {0,2}(MW(?:0[789]|10)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1727
1988
  device_replacement: '$1'
1728
1989
  brand_replacement: 'Aoc'
1729
1990
  model_replacement: '$1'
@@ -1734,11 +1995,11 @@ device_parsers:
1734
1995
  # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
1735
1996
  # @note: brand owned by luckystar
1736
1997
  #########
1737
- - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D) Build'
1998
+ - regex: '; {0,2}(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\) AppleWebKit)'
1738
1999
  device_replacement: 'Aoson $1'
1739
2000
  brand_replacement: 'Aoson'
1740
2001
  model_replacement: '$1'
1741
- - regex: '; *Aoson ([^;/]+) Build'
2002
+ - regex: '; {0,2}Aoson ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1742
2003
  regex_flag: 'i'
1743
2004
  device_replacement: 'Aoson $1'
1744
2005
  brand_replacement: 'Aoson'
@@ -1748,7 +2009,7 @@ device_parsers:
1748
2009
  # Apanda
1749
2010
  # @ref: http://www.apanda.com.cn/
1750
2011
  #########
1751
- - regex: '; *[Aa]panda[ _\-]([^;/]+) Build'
2012
+ - regex: '; {0,2}[Aa]panda[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1752
2013
  device_replacement: 'Apanda $1'
1753
2014
  brand_replacement: 'Apanda'
1754
2015
  model_replacement: '$1'
@@ -1758,23 +2019,23 @@ device_parsers:
1758
2019
  # @ref: http://www.archos.com/de/products/tablets.html
1759
2020
  # @ref: http://www.archos.com/de/products/smartphones/index.html
1760
2021
  #########
1761
- - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|[;/\(\)\-])'
2022
+ - regex: '; {0,2}(?:ARCHOS|Archos) ?(GAMEPAD.{0,200}?)(?: Build|\) AppleWebKit)'
1762
2023
  device_replacement: 'Archos $1'
1763
2024
  brand_replacement: 'Archos'
1764
2025
  model_replacement: '$1'
1765
- - regex: 'ARCHOS; GOGI; ([^;]+);'
2026
+ - regex: 'ARCHOS; GOGI; ([^;]{1,200});'
1766
2027
  device_replacement: 'Archos $1'
1767
2028
  brand_replacement: 'Archos'
1768
2029
  model_replacement: '$1'
1769
- - regex: '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\(\)\-]|$)'
2030
+ - regex: '(?:ARCHOS|Archos)[ _]?(.{0,200}?)(?: Build|[;/\(\)\-]|$)'
1770
2031
  device_replacement: 'Archos $1'
1771
2032
  brand_replacement: 'Archos'
1772
2033
  model_replacement: '$1'
1773
- - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4}) Build'
2034
+ - regex: '; {0,2}(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
1774
2035
  device_replacement: 'Archos $1'
1775
2036
  brand_replacement: 'Archos'
1776
2037
  model_replacement: '$1'
1777
- - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9) Build'
2038
+ - regex: '; {0,2}(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
1778
2039
  device_replacement: 'Archos $1'
1779
2040
  brand_replacement: 'Archos'
1780
2041
  model_replacement: '$1'
@@ -1783,11 +2044,11 @@ device_parsers:
1783
2044
  # A-rival
1784
2045
  # @ref: http://www.a-rival.de/de/
1785
2046
  #########
1786
- - regex: '; *(PAD-FMD[^;/]+) Build'
2047
+ - regex: '; {0,2}(PAD-FMD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1787
2048
  device_replacement: '$1'
1788
2049
  brand_replacement: 'Arival'
1789
2050
  model_replacement: '$1'
1790
- - regex: '; *(BioniQ) ?([^;/]+) Build'
2051
+ - regex: '; {0,2}(BioniQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1791
2052
  device_replacement: '$1 $2'
1792
2053
  brand_replacement: 'Arival'
1793
2054
  model_replacement: '$1 $2'
@@ -1796,11 +2057,11 @@ device_parsers:
1796
2057
  # Arnova
1797
2058
  # @ref: http://arnovatech.com/
1798
2059
  #########
1799
- - regex: '; *(AN\d[^;/]+|ARCHM\d+) Build'
2060
+ - regex: '; {0,2}(AN\d[^;/]{1,100}|ARCHM\d+)(?: Build|\) AppleWebKit)'
1800
2061
  device_replacement: 'Arnova $1'
1801
2062
  brand_replacement: 'Arnova'
1802
2063
  model_replacement: '$1'
1803
- - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+) Build'
2064
+ - regex: '; {0,2}(?:ARNOVA|Arnova) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1804
2065
  device_replacement: 'Arnova $1'
1805
2066
  brand_replacement: 'Arnova'
1806
2067
  model_replacement: '$1'
@@ -1809,7 +2070,7 @@ device_parsers:
1809
2070
  # Assistant
1810
2071
  # @ref: http://www.assistant.ua
1811
2072
  #########
1812
- - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build'
2073
+ - regex: '; {0,2}(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
1813
2074
  device_replacement: 'Assistant $1-$2'
1814
2075
  brand_replacement: 'Assistant'
1815
2076
  model_replacement: '$1-$2'
@@ -1818,11 +2079,11 @@ device_parsers:
1818
2079
  # Asus
1819
2080
  # @ref: http://www.asus.com/uk/Tablets_Mobile/
1820
2081
  #########
1821
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build'
2082
+ - regex: '; {0,2}(ME17\d[^;/]*|ME3\d{2}[^;/]{1,100}|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
1822
2083
  device_replacement: 'Asus $1'
1823
2084
  brand_replacement: 'Asus'
1824
2085
  model_replacement: '$1'
1825
- - regex: '; *ASUS[ _]*([^;/]+) Build'
2086
+ - regex: '; {0,2}ASUS[ _]{0,10}([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1826
2087
  device_replacement: 'Asus $1'
1827
2088
  brand_replacement: 'Asus'
1828
2089
  model_replacement: '$1'
@@ -1830,11 +2091,11 @@ device_parsers:
1830
2091
  #########
1831
2092
  # Garmin-Asus
1832
2093
  #########
1833
- - regex: '; *Garmin-Asus ([^;/]+) Build'
2094
+ - regex: '; {0,2}Garmin-Asus ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1834
2095
  device_replacement: 'Garmin-Asus $1'
1835
2096
  brand_replacement: 'Garmin-Asus'
1836
2097
  model_replacement: '$1'
1837
- - regex: '; *(Garminfone) Build'
2098
+ - regex: '; {0,2}(Garminfone)(?: Build|\) AppleWebKit)'
1838
2099
  device_replacement: 'Garmin $1'
1839
2100
  brand_replacement: 'Garmin-Asus'
1840
2101
  model_replacement: '$1'
@@ -1843,7 +2104,7 @@ device_parsers:
1843
2104
  # Attab
1844
2105
  # @ref: http://www.theattab.com/
1845
2106
  #########
1846
- - regex: '; (@TAB-[^;/]+) Build'
2107
+ - regex: '; (@TAB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1847
2108
  device_replacement: '$1'
1848
2109
  brand_replacement: 'Attab'
1849
2110
  model_replacement: '$1'
@@ -1853,7 +2114,7 @@ device_parsers:
1853
2114
  # @ref: ??
1854
2115
  # @note: Take care with Docomo T-01 Toshiba
1855
2116
  #########
1856
- - regex: '; *(T-(?:07|[^0]\d)[^;/]+) Build'
2117
+ - regex: '; {0,2}(T-(?:07|[^0]\d)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1857
2118
  device_replacement: '$1'
1858
2119
  brand_replacement: 'Audiosonic'
1859
2120
  model_replacement: '$1'
@@ -1862,7 +2123,7 @@ device_parsers:
1862
2123
  # Axioo
1863
2124
  # @ref: http://www.axiooworld.com/ww/index.php
1864
2125
  #########
1865
- - regex: '; *(?:Axioo[ _\-]([^;/]+)|(picopad)[ _\-]([^;/]+)) Build'
2126
+ - regex: '; {0,2}(?:Axioo[ _\-]([^;/]{1,100}?)|(picopad)[ _\-]([^;/]{1,100}?))(?: Build|\) AppleWebKit)'
1866
2127
  regex_flag: 'i'
1867
2128
  device_replacement: 'Axioo $1$2 $3'
1868
2129
  brand_replacement: 'Axioo'
@@ -1872,7 +2133,7 @@ device_parsers:
1872
2133
  # Azend
1873
2134
  # @ref: http://azendcorp.com/index.php/products/portable-electronics
1874
2135
  #########
1875
- - regex: '; *(V(?:100|700|800)[^;/]*) Build'
2136
+ - regex: '; {0,2}(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
1876
2137
  device_replacement: '$1'
1877
2138
  brand_replacement: 'Azend'
1878
2139
  model_replacement: '$1'
@@ -1881,7 +2142,7 @@ device_parsers:
1881
2142
  # Bak
1882
2143
  # @ref: http://www.bakinternational.com/produtos.php?cat=80
1883
2144
  #########
1884
- - regex: '; *(IBAK\-[^;/]*) Build'
2145
+ - regex: '; {0,2}(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
1885
2146
  regex_flag: 'i'
1886
2147
  device_replacement: '$1'
1887
2148
  brand_replacement: 'Bak'
@@ -1892,7 +2153,7 @@ device_parsers:
1892
2153
  # @ref: http://www.bedove.com/product.html
1893
2154
  # @models: HY6501|HY5001|X12|X21|I5
1894
2155
  #########
1895
- - regex: '; *(HY5001|HY6501|X12|X21|I5) Build'
2156
+ - regex: '; {0,2}(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
1896
2157
  device_replacement: 'Bedove $1'
1897
2158
  brand_replacement: 'Bedove'
1898
2159
  model_replacement: '$1'
@@ -1901,7 +2162,7 @@ device_parsers:
1901
2162
  # Benss
1902
2163
  # @ref: http://www.benss.net/
1903
2164
  #########
1904
- - regex: '; *(JC-[^;/]*) Build'
2165
+ - regex: '; {0,2}(JC-[^;/]*)(?: Build|\) AppleWebKit)'
1905
2166
  device_replacement: 'Benss $1'
1906
2167
  brand_replacement: 'Benss'
1907
2168
  model_replacement: '$1'
@@ -1911,7 +2172,7 @@ device_parsers:
1911
2172
  # @ref: http://uk.blackberry.com/
1912
2173
  # @note: Android Apps seams to be used here
1913
2174
  #########
1914
- - regex: '; *(BB) ([^;/]+) Build'
2175
+ - regex: '; {0,2}(BB) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1915
2176
  device_replacement: '$1 $2'
1916
2177
  brand_replacement: 'Blackberry'
1917
2178
  model_replacement: '$2'
@@ -1920,11 +2181,11 @@ device_parsers:
1920
2181
  # Blackbird
1921
2182
  # @ref: http://iblackbird.co.kr
1922
2183
  #########
1923
- - regex: '; *(BlackBird)[ _](I8.*) Build'
2184
+ - regex: '; {0,2}(BlackBird)[ _](I8.{0,200}?)(?: Build|\) AppleWebKit)'
1924
2185
  device_replacement: '$1 $2'
1925
2186
  brand_replacement: '$1'
1926
2187
  model_replacement: '$2'
1927
- - regex: '; *(BlackBird)[ _](.*) Build'
2188
+ - regex: '; {0,2}(BlackBird)[ _](.{0,200}?)(?: Build|\) AppleWebKit)'
1928
2189
  device_replacement: '$1 $2'
1929
2190
  brand_replacement: '$1'
1930
2191
  model_replacement: '$2'
@@ -1934,7 +2195,7 @@ device_parsers:
1934
2195
  # @ref: http://www.blaupunkt.com
1935
2196
  #########
1936
2197
  # Endeavour
1937
- - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+) Build'
2198
+ - regex: '; {0,2}([0-9]+BP[EM][^;/]*|Endeavour[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1938
2199
  device_replacement: 'Blaupunkt $1'
1939
2200
  brand_replacement: 'Blaupunkt'
1940
2201
  model_replacement: '$1'
@@ -1943,12 +2204,12 @@ device_parsers:
1943
2204
  # Blu
1944
2205
  # @ref: http://bluproducts.com
1945
2206
  #########
1946
- - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+) Build'
2207
+ - regex: '; {0,2}((?:BLU|Blu)[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1947
2208
  device_replacement: '$1$2'
1948
2209
  brand_replacement: 'Blu'
1949
2210
  model_replacement: '$2'
1950
2211
  # BMOBILE = operator branded device
1951
- - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5) Build'
2212
+ - regex: '; {0,2}(?:BMOBILE )?(Blu|BLU|DASH [^;/]{1,100}|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
1952
2213
  device_replacement: '$1'
1953
2214
  brand_replacement: 'Blu'
1954
2215
  model_replacement: '$1'
@@ -1958,7 +2219,7 @@ device_parsers:
1958
2219
  # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
1959
2220
  #########
1960
2221
  # tablet
1961
- - regex: '; *(TOUCH\d[^;/]+) Build'
2222
+ - regex: '; {0,2}(TOUCH\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1962
2223
  device_replacement: '$1'
1963
2224
  brand_replacement: 'Blusens'
1964
2225
  model_replacement: '$1'
@@ -1969,7 +2230,7 @@ device_parsers:
1969
2230
  # @note: Might collide with Maxx as AX is used also there.
1970
2231
  #########
1971
2232
  # smartphone
1972
- - regex: '; *(AX5\d+) Build'
2233
+ - regex: '; {0,2}(AX5\d+)(?: Build|\) AppleWebKit)'
1973
2234
  device_replacement: '$1'
1974
2235
  brand_replacement: 'Bmobile'
1975
2236
  model_replacement: '$1'
@@ -1978,11 +2239,11 @@ device_parsers:
1978
2239
  # bq
1979
2240
  # @ref: http://bqreaders.com
1980
2241
  #########
1981
- - regex: '; *([Bb]q) ([^;/]+);? Build'
2242
+ - regex: '; {0,2}([Bb]q) ([^;/]{1,100}?);?(?: Build|\) AppleWebKit)'
1982
2243
  device_replacement: '$1 $2'
1983
2244
  brand_replacement: 'bq'
1984
2245
  model_replacement: '$2'
1985
- - regex: '; *(Maxwell [^;/]+) Build'
2246
+ - regex: '; {0,2}(Maxwell [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1986
2247
  device_replacement: '$1'
1987
2248
  brand_replacement: 'bq'
1988
2249
  model_replacement: '$1'
@@ -1991,7 +2252,7 @@ device_parsers:
1991
2252
  # Braun Phototechnik
1992
2253
  # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
1993
2254
  #########
1994
- - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+) Build'
2255
+ - regex: '; {0,2}((?:B-Tab|B-TAB) ?\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1995
2256
  device_replacement: '$1'
1996
2257
  brand_replacement: 'Braun'
1997
2258
  model_replacement: '$1'
@@ -2000,7 +2261,7 @@ device_parsers:
2000
2261
  # Broncho
2001
2262
  # @ref: http://www.broncho.cn/
2002
2263
  #########
2003
- - regex: '; *(Broncho) ([^;/]+) Build'
2264
+ - regex: '; {0,2}(Broncho) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2004
2265
  device_replacement: '$1 $2'
2005
2266
  brand_replacement: '$1'
2006
2267
  model_replacement: '$2'
@@ -2009,7 +2270,7 @@ device_parsers:
2009
2270
  # Captiva
2010
2271
  # @ref: http://www.captiva-power.de
2011
2272
  #########
2012
- - regex: '; *CAPTIVA ([^;/]+) Build'
2273
+ - regex: '; {0,2}CAPTIVA ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2013
2274
  device_replacement: 'Captiva $1'
2014
2275
  brand_replacement: 'Captiva'
2015
2276
  model_replacement: '$1'
@@ -2018,7 +2279,7 @@ device_parsers:
2018
2279
  # Casio
2019
2280
  # @ref: http://www.casiogzone.com/
2020
2281
  #########
2021
- - regex: '; *(C771|CAL21|IS11CA) Build'
2282
+ - regex: '; {0,2}(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2022
2283
  device_replacement: '$1'
2023
2284
  brand_replacement: 'Casio'
2024
2285
  model_replacement: '$1'
@@ -2027,15 +2288,15 @@ device_parsers:
2027
2288
  # Cat
2028
2289
  # @ref: http://www.cat-sound.com
2029
2290
  #########
2030
- - regex: '; *(?:Cat|CAT) ([^;/]+) Build'
2291
+ - regex: '; {0,2}(?:Cat|CAT) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2031
2292
  device_replacement: 'Cat $1'
2032
2293
  brand_replacement: 'Cat'
2033
2294
  model_replacement: '$1'
2034
- - regex: '; *(?:Cat)(Nova.*) Build'
2295
+ - regex: '; {0,2}(?:Cat)(Nova.{0,200}?)(?: Build|\) AppleWebKit)'
2035
2296
  device_replacement: 'Cat $1'
2036
2297
  brand_replacement: 'Cat'
2037
2298
  model_replacement: '$1'
2038
- - regex: '; *(INM8002KP|ADM8000KP_[AB]) Build'
2299
+ - regex: '; {0,2}(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2039
2300
  device_replacement: '$1'
2040
2301
  brand_replacement: 'Cat'
2041
2302
  model_replacement: 'Tablet PHOENIX 8.1J0'
@@ -2045,7 +2306,7 @@ device_parsers:
2045
2306
  # @ref: http://www.celkonmobiles.com/?_a=products
2046
2307
  # @models: A10, A19Q, A101, A105, A107, A107\+, A112, A118, A119, A119Q, A15, A19, A20, A200, A220, A225, A22 Race, A27, A58, A59, A60, A62, A63, A64, A66, A67, A69, A75, A77, A79, A8\+, A83, A85, A86, A87, A89 Ultima, A9\+, A90, A900, A95, A97i, A98, AR 40, AR 45, AR 50, ML5
2047
2308
  #########
2048
- - regex: '; *(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2309
+ - regex: '; {0,2}(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2049
2310
  device_replacement: '$1'
2050
2311
  brand_replacement: 'Celkon'
2051
2312
  model_replacement: '$1'
@@ -2053,12 +2314,12 @@ device_parsers:
2053
2314
  device_replacement: '$1'
2054
2315
  brand_replacement: 'Celkon'
2055
2316
  model_replacement: '$1'
2056
- - regex: '; *(CT)-?(\d+) Build'
2317
+ - regex: '; {0,2}(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2057
2318
  device_replacement: '$1$2'
2058
2319
  brand_replacement: 'Celkon'
2059
2320
  model_replacement: '$1$2'
2060
2321
  # smartphones
2061
- - regex: '; *(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2322
+ - regex: '; {0,2}(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2062
2323
  device_replacement: '$1'
2063
2324
  brand_replacement: 'Celkon'
2064
2325
  model_replacement: '$1'
@@ -2069,7 +2330,7 @@ device_parsers:
2069
2330
  # @brief: China manufacturer makes tablets for different small brands
2070
2331
  # (eg. http://www.zeepad.net/index.html)
2071
2332
  #########
2072
- - regex: '; *(TPC[0-9]{4,5}) Build'
2333
+ - regex: '; {0,2}(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2073
2334
  device_replacement: '$1'
2074
2335
  brand_replacement: 'ChangJia'
2075
2336
  model_replacement: '$1'
@@ -2078,15 +2339,15 @@ device_parsers:
2078
2339
  # Cloudfone
2079
2340
  # @ref: http://www.cloudfonemobile.com/
2080
2341
  #########
2081
- - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+) Build'
2342
+ - regex: '; {0,2}(Cloudfone)[ _](Excite)([^ ][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2082
2343
  device_replacement: '$1 $2 $3'
2083
2344
  brand_replacement: 'Cloudfone'
2084
2345
  model_replacement: '$1 $2 $3'
2085
- - regex: '; *(Excite|ICE)[ _](\d+[^;/]+) Build'
2346
+ - regex: '; {0,2}(Excite|ICE)[ _](\d+[^;/]{0,100}?)(?: Build|\) AppleWebKit)'
2086
2347
  device_replacement: 'Cloudfone $1 $2'
2087
2348
  brand_replacement: 'Cloudfone'
2088
2349
  model_replacement: 'Cloudfone $1 $2'
2089
- - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+) Build'
2350
+ - regex: '; {0,2}(Cloudfone|CloudPad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2090
2351
  device_replacement: '$1 $2'
2091
2352
  brand_replacement: 'Cloudfone'
2092
2353
  model_replacement: '$1 $2'
@@ -2095,7 +2356,7 @@ device_parsers:
2095
2356
  # Cmx
2096
2357
  # @ref: http://cmx.at/de/
2097
2358
  #########
2098
- - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+) Build'
2359
+ - regex: '; {0,2}((?:Aquila|Clanga|Rapax)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2099
2360
  regex_flag: 'i'
2100
2361
  device_replacement: '$1'
2101
2362
  brand_replacement: 'Cmx'
@@ -2106,7 +2367,7 @@ device_parsers:
2106
2367
  # @ref: http://cobykyros.com
2107
2368
  # @note: Be careful with MID\d{3} from MpMan or Manta
2108
2369
  #########
2109
- - regex: '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\)])'
2370
+ - regex: '; {0,2}(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? {0,2}(?:Build|[;\)])'
2110
2371
  device_replacement: 'CobyKyros $1$2'
2111
2372
  brand_replacement: 'CobyKyros'
2112
2373
  model_replacement: '$1$2'
@@ -2115,7 +2376,7 @@ device_parsers:
2115
2376
  # Coolpad
2116
2377
  # @ref: ??
2117
2378
  #########
2118
- - regex: '; *([^;/]*)Coolpad[ _]([^;/]+) Build'
2379
+ - regex: '; {0,2}([^;/]{0,50})Coolpad[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2119
2380
  device_replacement: '$1$2'
2120
2381
  brand_replacement: 'Coolpad'
2121
2382
  model_replacement: '$1$2'
@@ -2124,7 +2385,7 @@ device_parsers:
2124
2385
  # Cube
2125
2386
  # @ref: http://www.cube-tablet.com/buy-products.html
2126
2387
  #########
2127
- - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*|A5300) Build'
2388
+ - regex: '; {0,2}(CUBE[ _])?([KU][0-9]+ ?GT.{0,200}?|A5300)(?: Build|\) AppleWebKit)'
2128
2389
  regex_flag: 'i'
2129
2390
  device_replacement: '$1$2'
2130
2391
  brand_replacement: 'Cube'
@@ -2134,12 +2395,12 @@ device_parsers:
2134
2395
  # Cubot
2135
2396
  # @ref: http://www.cubotmall.com/
2136
2397
  #########
2137
- - regex: '; *CUBOT ([^;/]+) Build'
2398
+ - regex: '; {0,2}CUBOT ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2138
2399
  regex_flag: 'i'
2139
2400
  device_replacement: '$1'
2140
2401
  brand_replacement: 'Cubot'
2141
2402
  model_replacement: '$1'
2142
- - regex: '; *(BOBBY) Build'
2403
+ - regex: '; {0,2}(BOBBY)(?: Build|\) AppleWebKit)'
2143
2404
  regex_flag: 'i'
2144
2405
  device_replacement: '$1'
2145
2406
  brand_replacement: 'Cubot'
@@ -2149,7 +2410,7 @@ device_parsers:
2149
2410
  # Danew
2150
2411
  # @ref: http://www.danew.com/produits-tablette.php
2151
2412
  #########
2152
- - regex: '; *(Dslide [^;/]+) Build'
2413
+ - regex: '; {0,2}(Dslide [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2153
2414
  device_replacement: '$1'
2154
2415
  brand_replacement: 'Danew'
2155
2416
  model_replacement: '$1'
@@ -2163,39 +2424,39 @@ device_parsers:
2163
2424
  # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
2164
2425
  # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
2165
2426
  #########
2166
- - regex: '; *(XCD)[ _]?(28|35) Build'
2427
+ - regex: '; {0,2}(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2167
2428
  device_replacement: 'Dell $1$2'
2168
2429
  brand_replacement: 'Dell'
2169
2430
  model_replacement: '$1$2'
2170
- - regex: '; *(001DL) Build'
2431
+ - regex: '; {0,2}(001DL)(?: Build|\) AppleWebKit)'
2171
2432
  device_replacement: 'Dell $1'
2172
2433
  brand_replacement: 'Dell'
2173
2434
  model_replacement: 'Streak'
2174
- - regex: '; *(?:Dell|DELL) (Streak) Build'
2435
+ - regex: '; {0,2}(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2175
2436
  device_replacement: 'Dell $1'
2176
2437
  brand_replacement: 'Dell'
2177
2438
  model_replacement: 'Streak'
2178
- - regex: '; *(101DL|GS01|Streak Pro[^;/]*) Build'
2439
+ - regex: '; {0,2}(101DL|GS01|Streak Pro[^;/]{0,100})(?: Build|\) AppleWebKit)'
2179
2440
  device_replacement: 'Dell $1'
2180
2441
  brand_replacement: 'Dell'
2181
2442
  model_replacement: 'Streak Pro'
2182
- - regex: '; *([Ss]treak ?7) Build'
2443
+ - regex: '; {0,2}([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2183
2444
  device_replacement: 'Dell $1'
2184
2445
  brand_replacement: 'Dell'
2185
2446
  model_replacement: 'Streak 7'
2186
- - regex: '; *(Mini-3iX) Build'
2447
+ - regex: '; {0,2}(Mini-3iX)(?: Build|\) AppleWebKit)'
2187
2448
  device_replacement: 'Dell $1'
2188
2449
  brand_replacement: 'Dell'
2189
2450
  model_replacement: '$1'
2190
- - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*|Streak[ _]Pro) Build'
2451
+ - regex: '; {0,2}(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.{0,200}?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2191
2452
  device_replacement: 'Dell $1'
2192
2453
  brand_replacement: 'Dell'
2193
2454
  model_replacement: '$1'
2194
- - regex: '; *Dell[ _]([^;/]+) Build'
2455
+ - regex: '; {0,2}Dell[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2195
2456
  device_replacement: 'Dell $1'
2196
2457
  brand_replacement: 'Dell'
2197
2458
  model_replacement: '$1'
2198
- - regex: '; *Dell ([^;/]+) Build'
2459
+ - regex: '; {0,2}Dell ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2199
2460
  device_replacement: 'Dell $1'
2200
2461
  brand_replacement: 'Dell'
2201
2462
  model_replacement: '$1'
@@ -2204,7 +2465,7 @@ device_parsers:
2204
2465
  # Denver
2205
2466
  # @ref: http://www.denver-electronics.com/tablets1/
2206
2467
  #########
2207
- - regex: '; *(TA[CD]-\d+[^;/]*) Build'
2468
+ - regex: '; {0,2}(TA[CD]-\d+[^;/]{0,100})(?: Build|\) AppleWebKit)'
2208
2469
  device_replacement: '$1'
2209
2470
  brand_replacement: 'Denver'
2210
2471
  model_replacement: '$1'
@@ -2213,7 +2474,7 @@ device_parsers:
2213
2474
  # Dex
2214
2475
  # @ref: http://dex.ua/
2215
2476
  #########
2216
- - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?) Build'
2477
+ - regex: '; {0,2}(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2217
2478
  device_replacement: '$1'
2218
2479
  brand_replacement: 'Dex'
2219
2480
  model_replacement: '$1'
@@ -2222,7 +2483,7 @@ device_parsers:
2222
2483
  # DNS AirTab
2223
2484
  # @ref: http://www.dns-shop.ru/
2224
2485
  #########
2225
- - regex: '; *(AirTab)[ _\-]([^;/]+) Build'
2486
+ - regex: '; {0,2}(AirTab)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2226
2487
  device_replacement: '$1 $2'
2227
2488
  brand_replacement: 'DNS'
2228
2489
  model_replacement: '$1 $2'
@@ -2231,43 +2492,43 @@ device_parsers:
2231
2492
  # Docomo (Operator Branded Device)
2232
2493
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2233
2494
  #########
2234
- - regex: '; *(F\-\d[^;/]+) Build'
2495
+ - regex: '; {0,2}(F\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2235
2496
  device_replacement: '$1'
2236
2497
  brand_replacement: 'Fujitsu'
2237
2498
  model_replacement: '$1'
2238
- - regex: '; *(HT-03A) Build'
2499
+ - regex: '; {0,2}(HT-03A)(?: Build|\) AppleWebKit)'
2239
2500
  device_replacement: '$1'
2240
2501
  brand_replacement: 'HTC'
2241
2502
  model_replacement: 'Magic'
2242
- - regex: '; *(HT\-\d[^;/]+) Build'
2503
+ - regex: '; {0,2}(HT\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2243
2504
  device_replacement: '$1'
2244
2505
  brand_replacement: 'HTC'
2245
2506
  model_replacement: '$1'
2246
- - regex: '; *(L\-\d[^;/]+) Build'
2507
+ - regex: '; {0,2}(L\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2247
2508
  device_replacement: '$1'
2248
2509
  brand_replacement: 'LG'
2249
2510
  model_replacement: '$1'
2250
- - regex: '; *(N\-\d[^;/]+) Build'
2511
+ - regex: '; {0,2}(N\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2251
2512
  device_replacement: '$1'
2252
2513
  brand_replacement: 'Nec'
2253
2514
  model_replacement: '$1'
2254
- - regex: '; *(P\-\d[^;/]+) Build'
2515
+ - regex: '; {0,2}(P\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2255
2516
  device_replacement: '$1'
2256
2517
  brand_replacement: 'Panasonic'
2257
2518
  model_replacement: '$1'
2258
- - regex: '; *(SC\-\d[^;/]+) Build'
2519
+ - regex: '; {0,2}(SC\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2259
2520
  device_replacement: '$1'
2260
2521
  brand_replacement: 'Samsung'
2261
2522
  model_replacement: '$1'
2262
- - regex: '; *(SH\-\d[^;/]+) Build'
2523
+ - regex: '; {0,2}(SH\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2263
2524
  device_replacement: '$1'
2264
2525
  brand_replacement: 'Sharp'
2265
2526
  model_replacement: '$1'
2266
- - regex: '; *(SO\-\d[^;/]+) Build'
2527
+ - regex: '; {0,2}(SO\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2267
2528
  device_replacement: '$1'
2268
2529
  brand_replacement: 'SonyEricsson'
2269
2530
  model_replacement: '$1'
2270
- - regex: '; *(T\-0[12][^;/]+) Build'
2531
+ - regex: '; {0,2}(T\-0[12][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2271
2532
  device_replacement: '$1'
2272
2533
  brand_replacement: 'Toshiba'
2273
2534
  model_replacement: '$1'
@@ -2276,7 +2537,7 @@ device_parsers:
2276
2537
  # DOOV
2277
2538
  # @ref: http://www.doov.com.cn/
2278
2539
  #########
2279
- - regex: '; *(DOOV)[ _]([^;/]+) Build'
2540
+ - regex: '; {0,2}(DOOV)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2280
2541
  device_replacement: '$1 $2'
2281
2542
  brand_replacement: 'DOOV'
2282
2543
  model_replacement: '$2'
@@ -2285,7 +2546,7 @@ device_parsers:
2285
2546
  # Enot
2286
2547
  # @ref: http://www.enot.ua/
2287
2548
  #########
2288
- - regex: '; *(Enot|ENOT)[ -]?([^;/]+) Build'
2549
+ - regex: '; {0,2}(Enot|ENOT)[ -]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2289
2550
  device_replacement: '$1 $2'
2290
2551
  brand_replacement: 'Enot'
2291
2552
  model_replacement: '$2'
@@ -2294,11 +2555,11 @@ device_parsers:
2294
2555
  # Evercoss
2295
2556
  # @ref: http://evercoss.com/android/
2296
2557
  #########
2297
- - regex: '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2558
+ - regex: '; {0,2}[^;/]{1,100} Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2298
2559
  device_replacement: 'CROSS $1'
2299
2560
  brand_replacement: 'Evercoss'
2300
2561
  model_replacement: 'Cross $1'
2301
- - regex: '; *(CROSS|Cross)[ _\-]([^;/]+) Build'
2562
+ - regex: '; {0,2}(CROSS|Cross)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2302
2563
  device_replacement: '$1 $2'
2303
2564
  brand_replacement: 'Evercoss'
2304
2565
  model_replacement: 'Cross $2'
@@ -2307,7 +2568,7 @@ device_parsers:
2307
2568
  # Explay
2308
2569
  # @ref: http://explay.ru/
2309
2570
  #########
2310
- - regex: '; *Explay[_ ](.+?)(?:[\)]| Build)'
2571
+ - regex: '; {0,2}Explay[_ ](.{1,200}?)(?:[\)]| Build)'
2311
2572
  device_replacement: '$1'
2312
2573
  brand_replacement: 'Explay'
2313
2574
  model_replacement: '$1'
@@ -2316,11 +2577,11 @@ device_parsers:
2316
2577
  # Fly
2317
2578
  # @ref: http://www.fly-phone.com/
2318
2579
  #########
2319
- - regex: '; *(IQ.*) Build'
2580
+ - regex: '; {0,2}(IQ.{0,200}?)(?: Build|\) AppleWebKit)'
2320
2581
  device_replacement: '$1'
2321
2582
  brand_replacement: 'Fly'
2322
2583
  model_replacement: '$1'
2323
- - regex: '; *(Fly|FLY)[ _](IQ[^;]+|F[34]\d+[^;]*);? Build'
2584
+ - regex: '; {0,2}(Fly|FLY)[ _](IQ[^;]{1,100}?|F[34]\d+[^;]{0,100}?);?(?: Build|\) AppleWebKit)'
2324
2585
  device_replacement: '$1 $2'
2325
2586
  brand_replacement: 'Fly'
2326
2587
  model_replacement: '$2'
@@ -2329,7 +2590,7 @@ device_parsers:
2329
2590
  # Fujitsu
2330
2591
  # @ref: http://www.fujitsu.com/global/
2331
2592
  #########
2332
- - regex: '; *(M532|Q572|FJL21) Build/'
2593
+ - regex: '; {0,2}(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2333
2594
  device_replacement: '$1'
2334
2595
  brand_replacement: 'Fujitsu'
2335
2596
  model_replacement: '$1'
@@ -2338,7 +2599,7 @@ device_parsers:
2338
2599
  # Galapad
2339
2600
  # @ref: http://www.galapad.net/product.html
2340
2601
  #########
2341
- - regex: '; *(G1) Build'
2602
+ - regex: '; {0,2}(G1)(?: Build|\) AppleWebKit)'
2342
2603
  device_replacement: '$1'
2343
2604
  brand_replacement: 'Galapad'
2344
2605
  model_replacement: '$1'
@@ -2347,7 +2608,7 @@ device_parsers:
2347
2608
  # Geeksphone
2348
2609
  # @ref: http://www.geeksphone.com/
2349
2610
  #########
2350
- - regex: '; *(Geeksphone) ([^;/]+) Build'
2611
+ - regex: '; {0,2}(Geeksphone) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2351
2612
  device_replacement: '$1 $2'
2352
2613
  brand_replacement: '$1'
2353
2614
  model_replacement: '$2'
@@ -2356,8 +2617,7 @@ device_parsers:
2356
2617
  # Gfive
2357
2618
  # @ref: http://www.gfivemobile.com/en
2358
2619
  #########
2359
- #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
2360
- - regex: '; *(G[^F]?FIVE) ([^;/]+) Build'
2620
+ - regex: '; {0,2}(G[^F]?FIVE) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2361
2621
  device_replacement: '$1 $2'
2362
2622
  brand_replacement: 'Gfive'
2363
2623
  model_replacement: '$2'
@@ -2366,16 +2626,16 @@ device_parsers:
2366
2626
  # Gionee
2367
2627
  # @ref: http://www.gionee.com/
2368
2628
  #########
2369
- - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+|) Build'
2629
+ - regex: '; {0,2}(Gionee)[ _\-]([^;/]{1,100}?)(?:/[^;/]{1,100}|)(?: Build|\) AppleWebKit)'
2370
2630
  regex_flag: 'i'
2371
2631
  device_replacement: '$1 $2'
2372
2632
  brand_replacement: 'Gionee'
2373
2633
  model_replacement: '$2'
2374
- - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1) Build'
2634
+ - regex: '; {0,2}(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2375
2635
  device_replacement: 'Gionee $1'
2376
2636
  brand_replacement: 'Gionee'
2377
2637
  model_replacement: '$1'
2378
- - regex: '; *(E3) Build/JOP40D'
2638
+ - regex: '; {0,2}(E3) Build/JOP40D'
2379
2639
  device_replacement: 'Gionee $1'
2380
2640
  brand_replacement: 'Gionee'
2381
2641
  model_replacement: '$1'
@@ -2389,11 +2649,11 @@ device_parsers:
2389
2649
  # GoClever
2390
2650
  # @ref: http://www.goclever.com
2391
2651
  #########
2392
- - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB) Build'
2652
+ - regex: '; {0,2}((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]{0,100}|PLAYTAB)(?: Build|\) AppleWebKit)'
2393
2653
  device_replacement: 'GoClever $1'
2394
2654
  brand_replacement: 'GoClever'
2395
2655
  model_replacement: '$1'
2396
- - regex: '; *GOCLEVER ([^;/]+) Build'
2656
+ - regex: '; {0,2}GOCLEVER ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2397
2657
  device_replacement: 'GoClever $1'
2398
2658
  brand_replacement: 'GoClever'
2399
2659
  model_replacement: '$1'
@@ -2402,11 +2662,11 @@ device_parsers:
2402
2662
  # Google
2403
2663
  # @ref: http://www.google.de/glass/start/
2404
2664
  #########
2405
- - regex: '; *(Glass \d+) Build'
2665
+ - regex: '; {0,2}(Glass \d+)(?: Build|\) AppleWebKit)'
2406
2666
  device_replacement: '$1'
2407
2667
  brand_replacement: 'Google'
2408
2668
  model_replacement: '$1'
2409
- - regex: '; *(Pixel.*) Build'
2669
+ - regex: '; {0,2}(Pixel.{0,200}?)(?: Build|\) AppleWebKit)'
2410
2670
  device_replacement: '$1'
2411
2671
  brand_replacement: 'Google'
2412
2672
  model_replacement: '$1'
@@ -2415,7 +2675,7 @@ device_parsers:
2415
2675
  # Gigabyte
2416
2676
  # @ref: http://gsmart.gigabytecm.com/en/
2417
2677
  #########
2418
- - regex: '; *(GSmart)[ -]([^/]+) Build'
2678
+ - regex: '; {0,2}(GSmart)[ -]([^/]{1,50})(?: Build|\) AppleWebKit)'
2419
2679
  device_replacement: '$1 $2'
2420
2680
  brand_replacement: 'Gigabyte'
2421
2681
  model_replacement: '$1 $2'
@@ -2424,7 +2684,7 @@ device_parsers:
2424
2684
  # Freescale development boards
2425
2685
  # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
2426
2686
  #########
2427
- - regex: '; *(imx5[13]_[^/]+) Build'
2687
+ - regex: '; {0,2}(imx5[13]_[^/]{1,50})(?: Build|\) AppleWebKit)'
2428
2688
  device_replacement: 'Freescale $1'
2429
2689
  brand_replacement: 'Freescale'
2430
2690
  model_replacement: '$1'
@@ -2434,11 +2694,11 @@ device_parsers:
2434
2694
  # @ref: http://www.haier.com/
2435
2695
  # @ref: http://www.haier.com/de/produkte/tablet/
2436
2696
  #########
2437
- - regex: '; *Haier[ _\-]([^/]+) Build'
2697
+ - regex: '; {0,2}Haier[ _\-]([^/]{1,50})(?: Build|\) AppleWebKit)'
2438
2698
  device_replacement: 'Haier $1'
2439
2699
  brand_replacement: 'Haier'
2440
2700
  model_replacement: '$1'
2441
- - regex: '; *(PAD1016) Build'
2701
+ - regex: '; {0,2}(PAD1016)(?: Build|\) AppleWebKit)'
2442
2702
  device_replacement: 'Haipad $1'
2443
2703
  brand_replacement: 'Haipad'
2444
2704
  model_replacement: '$1'
@@ -2448,7 +2708,7 @@ device_parsers:
2448
2708
  # @ref: http://www.haipad.net/
2449
2709
  # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
2450
2710
  #########
2451
- - regex: '; *(M701|M7|M8|M9) Build'
2711
+ - regex: '; {0,2}(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2452
2712
  device_replacement: 'Haipad $1'
2453
2713
  brand_replacement: 'Haipad'
2454
2714
  model_replacement: '$1'
@@ -2458,7 +2718,7 @@ device_parsers:
2458
2718
  # @ref: http://www.hannspree.eu/
2459
2719
  # @models: SN10T1|SN10T2|SN70T31B|SN70T32W
2460
2720
  #########
2461
- - regex: '; *(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2721
+ - regex: '; {0,2}(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2462
2722
  device_replacement: 'Hannspree $1'
2463
2723
  brand_replacement: 'Hannspree'
2464
2724
  model_replacement: '$1'
@@ -2467,11 +2727,11 @@ device_parsers:
2467
2727
  # HCLme
2468
2728
  # @ref: http://www.hclmetablet.com/india/
2469
2729
  #########
2470
- - regex: 'Build/HCL ME Tablet ([^;\)]+)[\);]'
2730
+ - regex: 'Build/HCL ME Tablet ([^;\)]{1,3})[\);]'
2471
2731
  device_replacement: 'HCLme $1'
2472
2732
  brand_replacement: 'HCLme'
2473
2733
  model_replacement: '$1'
2474
- - regex: '; *([^;\/]+) Build/HCL'
2734
+ - regex: '; {0,2}([^;\/]+) Build/HCL'
2475
2735
  device_replacement: 'HCLme $1'
2476
2736
  brand_replacement: 'HCLme'
2477
2737
  model_replacement: '$1'
@@ -2480,7 +2740,7 @@ device_parsers:
2480
2740
  # Hena
2481
2741
  # @ref: http://www.henadigital.com/en/product/index.asp?id=6
2482
2742
  #########
2483
- - regex: '; *(MID-?\d{4}C[EM]) Build'
2743
+ - regex: '; {0,2}(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2484
2744
  device_replacement: 'Hena $1'
2485
2745
  brand_replacement: 'Hena'
2486
2746
  model_replacement: '$1'
@@ -2489,11 +2749,11 @@ device_parsers:
2489
2749
  # Hisense
2490
2750
  # @ref: http://www.hisense.com/
2491
2751
  #########
2492
- - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+) Build'
2752
+ - regex: '; {0,2}(EG\d{2,}|HS-[^;/]{1,100}|MIRA[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2493
2753
  device_replacement: 'Hisense $1'
2494
2754
  brand_replacement: 'Hisense'
2495
2755
  model_replacement: '$1'
2496
- - regex: '; *(andromax[^;/]+) Build'
2756
+ - regex: '; {0,2}(andromax[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2497
2757
  regex_flag: 'i'
2498
2758
  device_replacement: 'Hisense $1'
2499
2759
  brand_replacement: 'Hisense'
@@ -2503,7 +2763,7 @@ device_parsers:
2503
2763
  # hitech
2504
2764
  # @ref: http://www.hitech-mobiles.com/
2505
2765
  #########
2506
- - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE) Build'
2766
+ - regex: '; {0,2}(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2507
2767
  device_replacement: 'AMAZE $1$2'
2508
2768
  brand_replacement: 'hitech'
2509
2769
  model_replacement: 'AMAZE $1$2'
@@ -2512,15 +2772,15 @@ device_parsers:
2512
2772
  # HP
2513
2773
  # @ref: http://www.hp.com/
2514
2774
  #########
2515
- - regex: '; *(PlayBook) Build'
2775
+ - regex: '; {0,2}(PlayBook)(?: Build|\) AppleWebKit)'
2516
2776
  device_replacement: 'HP $1'
2517
2777
  brand_replacement: 'HP'
2518
2778
  model_replacement: '$1'
2519
- - regex: '; *HP ([^/]+) Build'
2779
+ - regex: '; {0,2}HP ([^/]{1,50})(?: Build|\) AppleWebKit)'
2520
2780
  device_replacement: 'HP $1'
2521
2781
  brand_replacement: 'HP'
2522
2782
  model_replacement: '$1'
2523
- - regex: '; *([^/]+_tenderloin) Build'
2783
+ - regex: '; {0,2}([^/]{1,30}_tenderloin)(?: Build|\) AppleWebKit)'
2524
2784
  device_replacement: 'HP TouchPad'
2525
2785
  brand_replacement: 'HP'
2526
2786
  model_replacement: 'TouchPad'
@@ -2530,62 +2790,66 @@ device_parsers:
2530
2790
  # @ref: http://www.huaweidevice.com
2531
2791
  # @note: Needs to be before HTC due to Desire HD Build on U8815
2532
2792
  #########
2533
- - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2793
+ - regex: '; {0,2}(HUAWEI |Huawei-|)([UY][^;/]{1,100}) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2534
2794
  device_replacement: '$1$2'
2535
2795
  brand_replacement: 'Huawei'
2536
2796
  model_replacement: '$2'
2537
- - regex: '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)[^\);]*\)'
2797
+ - regex: '; {0,2}([^;/]{1,100}) Build[/ ]Huawei(MT1-U06|[A-Z]{1,50}\d+[^\);]{1,50})\)'
2538
2798
  device_replacement: '$1'
2539
2799
  brand_replacement: 'Huawei'
2540
2800
  model_replacement: '$2'
2541
- - regex: '; *(S7|M860) Build'
2801
+ - regex: '; {0,2}(S7|M860) Build'
2542
2802
  device_replacement: '$1'
2543
2803
  brand_replacement: 'Huawei'
2544
2804
  model_replacement: '$1'
2545
- - regex: '; *((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2805
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2546
2806
  device_replacement: '$1$2'
2547
2807
  brand_replacement: 'Huawei'
2548
2808
  model_replacement: '$2'
2549
- - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
2809
+ - regex: '; {0,2}((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]{1,100}) Build'
2550
2810
  device_replacement: '$1$2'
2551
2811
  brand_replacement: 'Huawei'
2552
2812
  model_replacement: '$2'
2553
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]+) Build'
2813
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]{1,100}) Build'
2554
2814
  device_replacement: '$1$2'
2555
2815
  brand_replacement: 'Huawei'
2556
2816
  model_replacement: '$2'
2557
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)([^;/]+) Build'
2817
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)([^;/]{1,100}) Build'
2558
2818
  device_replacement: '$1$2'
2559
2819
  brand_replacement: 'Huawei'
2560
2820
  model_replacement: '$2'
2561
- - regex: '; *(MediaPad[^;]+|SpringBoard) Build/Huawei'
2821
+ - regex: '; {0,2}(MediaPad[^;]{1,200}|SpringBoard) Build/Huawei'
2562
2822
  device_replacement: '$1'
2563
2823
  brand_replacement: 'Huawei'
2564
2824
  model_replacement: '$1'
2565
- - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
2825
+ - regex: '; {0,2}([^;]{1,200}) Build/(?:Huawei|HUAWEI)'
2566
2826
  device_replacement: '$1'
2567
2827
  brand_replacement: 'Huawei'
2568
2828
  model_replacement: '$1'
2569
- - regex: '; *([Uu])([89]\d{3}) Build'
2829
+ - regex: '; {0,2}([Uu])([89]\d{3}) Build'
2570
2830
  device_replacement: '$1$2'
2571
2831
  brand_replacement: 'Huawei'
2572
2832
  model_replacement: 'U$2'
2573
- - regex: '; *(?:Ideos |IDEOS )(S7) Build'
2833
+ - regex: '; {0,2}(?:Ideos |IDEOS )(S7) Build'
2574
2834
  device_replacement: 'Huawei Ideos$1'
2575
2835
  brand_replacement: 'Huawei'
2576
2836
  model_replacement: 'Ideos$1'
2577
- - regex: '; *(?:Ideos |IDEOS )([^;/]+\s*|\s*)Build'
2837
+ - regex: '; {0,2}(?:Ideos |IDEOS )([^;/]{1,50}\s{0,5}|\s{0,5})Build'
2578
2838
  device_replacement: 'Huawei Ideos$1'
2579
2839
  brand_replacement: 'Huawei'
2580
2840
  model_replacement: 'Ideos$1'
2581
- - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]'
2841
+ - regex: '; {0,2}(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.{1,200}?) Build[/ ]'
2582
2842
  device_replacement: 'Huawei $1'
2583
2843
  brand_replacement: 'Huawei'
2584
2844
  model_replacement: '$1'
2585
- - regex: '; *((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2845
+ - regex: '; {0,2}((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2586
2846
  device_replacement: 'Huawei $1'
2587
2847
  brand_replacement: 'Huawei'
2588
2848
  model_replacement: '$1'
2849
+ - regex: '; {0,2}([^;]{1,200}) Build/(HONOR|Honor)'
2850
+ device_replacement: 'Huawei Honor $1'
2851
+ brand_replacement: 'Huawei'
2852
+ model_replacement: 'Honor $1'
2589
2853
 
2590
2854
  #########
2591
2855
  # HTC
@@ -2593,7 +2857,7 @@ device_parsers:
2593
2857
  # @ref: http://en.wikipedia.org/wiki/List_of_HTC_phones
2594
2858
  #########
2595
2859
 
2596
- - regex: '; *HTC[ _]([^;]+); Windows Phone'
2860
+ - regex: '; {0,2}HTC[ _]([^;]{1,200}); Windows Phone'
2597
2861
  device_replacement: 'HTC $1'
2598
2862
  brand_replacement: 'HTC'
2599
2863
  model_replacement: '$1'
@@ -2601,59 +2865,59 @@ device_parsers:
2601
2865
  # Android HTC with Version Number matcher
2602
2866
  # ; HTC_0P3Z11/1.12.161.3 Build
2603
2867
  # ;HTC_A3335 V2.38.841.1 Build
2604
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2868
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2605
2869
  device_replacement: 'HTC $1'
2606
2870
  brand_replacement: 'HTC'
2607
2871
  model_replacement: '$1'
2608
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2872
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2609
2873
  device_replacement: 'HTC $1 $2'
2610
2874
  brand_replacement: 'HTC'
2611
2875
  model_replacement: '$1 $2'
2612
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2876
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2613
2877
  device_replacement: 'HTC $1 $2 $3'
2614
2878
  brand_replacement: 'HTC'
2615
2879
  model_replacement: '$1 $2 $3'
2616
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2880
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2617
2881
  device_replacement: 'HTC $1 $2 $3 $4'
2618
2882
  brand_replacement: 'HTC'
2619
2883
  model_replacement: '$1 $2 $3 $4'
2620
2884
 
2621
2885
  # Android HTC without Version Number matcher
2622
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
2886
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: {0,2}Build|[;\)]| - )'
2623
2887
  device_replacement: 'HTC $1'
2624
2888
  brand_replacement: 'HTC'
2625
2889
  model_replacement: '$1'
2626
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
2890
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: {0,2}Build|[;\)]| - )'
2627
2891
  device_replacement: 'HTC $1 $2'
2628
2892
  brand_replacement: 'HTC'
2629
2893
  model_replacement: '$1 $2'
2630
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
2894
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: {0,2}Build|[;\)]| - )'
2631
2895
  device_replacement: 'HTC $1 $2 $3'
2632
2896
  brand_replacement: 'HTC'
2633
2897
  model_replacement: '$1 $2 $3'
2634
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
2898
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: {0,2}Build|[;\)]| - )'
2635
2899
  device_replacement: 'HTC $1 $2 $3 $4'
2636
2900
  brand_replacement: 'HTC'
2637
2901
  model_replacement: '$1 $2 $3 $4'
2638
2902
 
2639
2903
  # HTC Streaming Player
2640
- - regex: 'HTC Streaming Player [^\/]*/[^\/]*/ htc_([^/]+) /'
2904
+ - regex: 'HTC Streaming Player [^\/]{0,30}/[^\/]{0,10}/ htc_([^/]{1,10}) /'
2641
2905
  device_replacement: 'HTC $1'
2642
2906
  brand_replacement: 'HTC'
2643
2907
  model_replacement: '$1'
2644
2908
  # general matcher for anything else
2645
- - regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2909
+ - regex: '(?:[;,] {0,2}|^)(?:htccn_chs-|)HTC[ _-]?([^;]{1,200}?)(?: {0,2}Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2646
2910
  regex_flag: 'i'
2647
2911
  device_replacement: 'HTC $1'
2648
2912
  brand_replacement: 'HTC'
2649
2913
  model_replacement: '$1'
2650
2914
  # Android matchers without HTC
2651
- - regex: '; *(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
2915
+ - regex: '; {0,2}(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
2652
2916
  regex_flag: 'i'
2653
2917
  device_replacement: 'HTC $1'
2654
2918
  brand_replacement: 'HTC'
2655
2919
  model_replacement: '$1'
2656
- - regex: '; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\)]|Build|MIUI|1\.0)'
2920
+ - regex: '; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\)]|Build|MIUI|1\.0)'
2657
2921
  regex_flag: 'i'
2658
2922
  device_replacement: 'HTC $1 $2'
2659
2923
  brand_replacement: 'HTC'
@@ -2663,16 +2927,16 @@ device_parsers:
2663
2927
  # Hyundai
2664
2928
  # @ref: http://www.hyundaitechnologies.com
2665
2929
  #########
2666
- - regex: '; *HYUNDAI (T\d[^/]*) Build'
2930
+ - regex: '; {0,2}HYUNDAI (T\d[^/]{0,10})(?: Build|\) AppleWebKit)'
2667
2931
  device_replacement: 'Hyundai $1'
2668
2932
  brand_replacement: 'Hyundai'
2669
2933
  model_replacement: '$1'
2670
- - regex: '; *HYUNDAI ([^;/]+) Build'
2934
+ - regex: '; {0,2}HYUNDAI ([^;/]{1,10}?)(?: Build|\) AppleWebKit)'
2671
2935
  device_replacement: 'Hyundai $1'
2672
2936
  brand_replacement: 'Hyundai'
2673
2937
  model_replacement: '$1'
2674
2938
  # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
2675
- - regex: '; *(X700|Hold X|MB-6900) Build'
2939
+ - regex: '; {0,2}(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2676
2940
  device_replacement: 'Hyundai $1'
2677
2941
  brand_replacement: 'Hyundai'
2678
2942
  model_replacement: '$1'
@@ -2681,12 +2945,12 @@ device_parsers:
2681
2945
  # iBall
2682
2946
  # @ref: http://www.iball.co.in/Category/Mobiles/22
2683
2947
  #########
2684
- - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*) Build'
2948
+ - regex: '; {0,2}(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2685
2949
  regex_flag: 'i'
2686
2950
  device_replacement: '$1 $2'
2687
2951
  brand_replacement: 'iBall'
2688
2952
  model_replacement: '$1 $2'
2689
- - regex: '; *(IBall)(?:[ _]([^;/]+)|) Build'
2953
+ - regex: '; {0,2}(IBall)(?:[ _]([^;/]{1,100}?)|)(?: Build|\) AppleWebKit)'
2690
2954
  regex_flag: 'i'
2691
2955
  device_replacement: '$1 $2'
2692
2956
  brand_replacement: 'iBall'
@@ -2696,7 +2960,7 @@ device_parsers:
2696
2960
  # IconBIT
2697
2961
  # @ref: http://www.iconbit.com/catalog/tablets/
2698
2962
  #########
2699
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|) Build'
2963
+ - regex: '; {0,2}(NT-\d+[^ ;/]{0,50}|Net[Tt]AB [^;/]{1,50}|Mercury [A-Z]{1,50}|iconBIT)(?: S/N:[^;/]{1,50}|)(?: Build|\) AppleWebKit)'
2700
2964
  device_replacement: '$1'
2701
2965
  brand_replacement: 'IconBIT'
2702
2966
  model_replacement: '$1'
@@ -2705,7 +2969,7 @@ device_parsers:
2705
2969
  # IMO
2706
2970
  # @ref: http://www.ponselimo.com/
2707
2971
  #########
2708
- - regex: '; *(IMO)[ _]([^;/]+) Build'
2972
+ - regex: '; {0,2}(IMO)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2709
2973
  regex_flag: 'i'
2710
2974
  device_replacement: '$1 $2'
2711
2975
  brand_replacement: 'IMO'
@@ -2715,12 +2979,12 @@ device_parsers:
2715
2979
  # i-mobile
2716
2980
  # @ref: http://www.i-mobilephone.com/
2717
2981
  #########
2718
- - regex: '; *i-?mobile[ _]([^/]+) Build/'
2982
+ - regex: '; {0,2}i-?mobile[ _]([^/]{1,50})(?: Build|\) AppleWebKit)'
2719
2983
  regex_flag: 'i'
2720
2984
  device_replacement: 'i-mobile $1'
2721
2985
  brand_replacement: 'imobile'
2722
2986
  model_replacement: '$1'
2723
- - regex: '; *(i-(?:style|note)[^/]*) Build/'
2987
+ - regex: '; {0,2}(i-(?:style|note)[^/]{0,10})(?: Build|\) AppleWebKit)'
2724
2988
  regex_flag: 'i'
2725
2989
  device_replacement: 'i-mobile $1'
2726
2990
  brand_replacement: 'imobile'
@@ -2730,7 +2994,7 @@ device_parsers:
2730
2994
  # Impression
2731
2995
  # @ref: http://impression.ua/planshetnye-kompyutery
2732
2996
  #########
2733
- - regex: '; *(ImPAD) ?(\d+(?:.)*) Build'
2997
+ - regex: '; {0,2}(ImPAD) ?(\d+(?:.){0,100}?)(?: Build|\) AppleWebKit)'
2734
2998
  device_replacement: '$1 $2'
2735
2999
  brand_replacement: 'Impression'
2736
3000
  model_replacement: '$1 $2'
@@ -2739,7 +3003,7 @@ device_parsers:
2739
3003
  # Infinix
2740
3004
  # @ref: http://www.infinixmobility.com/index.html
2741
3005
  #########
2742
- - regex: '; *(Infinix)[ _]([^;/]+) Build'
3006
+ - regex: '; {0,2}(Infinix)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2743
3007
  device_replacement: '$1 $2'
2744
3008
  brand_replacement: 'Infinix'
2745
3009
  model_replacement: '$2'
@@ -2748,7 +3012,7 @@ device_parsers:
2748
3012
  # Informer
2749
3013
  # @ref: ??
2750
3014
  #########
2751
- - regex: '; *(Informer)[ \-]([^;/]+) Build'
3015
+ - regex: '; {0,2}(Informer)[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2752
3016
  device_replacement: '$1 $2'
2753
3017
  brand_replacement: 'Informer'
2754
3018
  model_replacement: '$2'
@@ -2758,7 +3022,7 @@ device_parsers:
2758
3022
  # @ref: http://www.intenso.de
2759
3023
  # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
2760
3024
  #########
2761
- - regex: '; *(TAB) ?([78][12]4) Build'
3025
+ - regex: '; {0,2}(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
2762
3026
  device_replacement: 'Intenso $1'
2763
3027
  brand_replacement: 'Intenso'
2764
3028
  model_replacement: '$1 $2'
@@ -2769,21 +3033,21 @@ device_parsers:
2769
3033
  # @note: Zync also offers a "Cloud Z5" device
2770
3034
  #########
2771
3035
  # smartphones
2772
- - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)'
3036
+ - regex: '; {0,2}(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]{1,100}?) {0,2}(?:Build|;)'
2773
3037
  device_replacement: '$1$2$3'
2774
3038
  brand_replacement: 'Intex'
2775
3039
  model_replacement: '$1 $3'
2776
3040
  # matches "INTEX CLOUD X1"
2777
- - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
3041
+ - regex: '; {0,2}(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) {0,2}(?:Build|;)'
2778
3042
  device_replacement: '$1 $2'
2779
3043
  brand_replacement: 'Intex'
2780
3044
  model_replacement: '$1 $2'
2781
3045
  # tablets
2782
- - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
3046
+ - regex: '; {0,2}([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]{0,50}) {0,2}(?:Build|;)'
2783
3047
  device_replacement: '$1 $2 $3'
2784
3048
  brand_replacement: 'Intex'
2785
3049
  model_replacement: 'iBuddy $2 $3'
2786
- - regex: '; *(I-Buddy)[ _]([^;/]+) *(?:Build|;)'
3050
+ - regex: '; {0,2}(I-Buddy)[ _]([^;/]{1,100}?) {0,2}(?:Build|;)'
2787
3051
  device_replacement: '$1 $2'
2788
3052
  brand_replacement: 'Intex'
2789
3053
  model_replacement: 'iBuddy $2'
@@ -2792,7 +3056,7 @@ device_parsers:
2792
3056
  # iOCEAN
2793
3057
  # @ref: http://www.iocean.cc/
2794
3058
  #########
2795
- - regex: '; *(iOCEAN) ([^/]+) Build'
3059
+ - regex: '; {0,2}(iOCEAN) ([^/]{1,50})(?: Build|\) AppleWebKit)'
2796
3060
  regex_flag: 'i'
2797
3061
  device_replacement: '$1 $2'
2798
3062
  brand_replacement: 'iOCEAN'
@@ -2802,7 +3066,7 @@ device_parsers:
2802
3066
  # i.onik
2803
3067
  # @ref: http://www.i-onik.de/
2804
3068
  #########
2805
- - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+) Build'
3069
+ - regex: '; {0,2}(TP\d+(?:\.\d+|)\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2806
3070
  device_replacement: 'ionik $1'
2807
3071
  brand_replacement: 'ionik'
2808
3072
  model_replacement: '$1'
@@ -2811,21 +3075,30 @@ device_parsers:
2811
3075
  # IRU.ru
2812
3076
  # @ref: http://www.iru.ru/catalog/soho/planetable/
2813
3077
  #########
2814
- - regex: '; *(M702pro) Build'
3078
+ - regex: '; {0,2}(M702pro)(?: Build|\) AppleWebKit)'
2815
3079
  device_replacement: '$1'
2816
3080
  brand_replacement: 'Iru'
2817
3081
  model_replacement: '$1'
2818
3082
 
3083
+ #########
3084
+ # Itel Mobile
3085
+ # @ref: https://www.itel-mobile.com/global/products/
3086
+ #########
3087
+ - regex: '; {0,2}itel ([^;/]*)(?: Build|\) AppleWebKit)'
3088
+ device_replacement: 'Itel $1'
3089
+ brand_replacement: 'Itel'
3090
+ model_replacement: '$1'
3091
+
2819
3092
  #########
2820
3093
  # Ivio
2821
3094
  # @ref: http://www.ivio.com/mobile.php
2822
3095
  # @models: DG80,DG20,DE38,DE88,MD70
2823
3096
  #########
2824
- - regex: '; *(DE88Plus|MD70) Build'
3097
+ - regex: '; {0,2}(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
2825
3098
  device_replacement: '$1'
2826
3099
  brand_replacement: 'Ivio'
2827
3100
  model_replacement: '$1'
2828
- - regex: '; *IVIO[_\-]([^;/]+) Build'
3101
+ - regex: '; {0,2}IVIO[_\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2829
3102
  device_replacement: '$1'
2830
3103
  brand_replacement: 'Ivio'
2831
3104
  model_replacement: '$1'
@@ -2834,7 +3107,7 @@ device_parsers:
2834
3107
  # Jaytech
2835
3108
  # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
2836
3109
  #########
2837
- - regex: '; *(TPC-\d+|JAY-TECH) Build'
3110
+ - regex: '; {0,2}(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
2838
3111
  device_replacement: '$1'
2839
3112
  brand_replacement: 'Jaytech'
2840
3113
  model_replacement: '$1'
@@ -2843,7 +3116,7 @@ device_parsers:
2843
3116
  # Jiayu
2844
3117
  # @ref: http://www.ejiayu.com/en/Product.html
2845
3118
  #########
2846
- - regex: '; *(JY-[^;/]+|G[234]S?) Build'
3119
+ - regex: '; {0,2}(JY-[^;/]{1,100}|G[234]S?)(?: Build|\) AppleWebKit)'
2847
3120
  device_replacement: '$1'
2848
3121
  brand_replacement: 'Jiayu'
2849
3122
  model_replacement: '$1'
@@ -2852,7 +3125,7 @@ device_parsers:
2852
3125
  # JXD
2853
3126
  # @ref: http://www.jxd.hk/
2854
3127
  #########
2855
- - regex: '; *(JXD)[ _\-]([^;/]+) Build'
3128
+ - regex: '; {0,2}(JXD)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2856
3129
  device_replacement: '$1 $2'
2857
3130
  brand_replacement: 'JXD'
2858
3131
  model_replacement: '$2'
@@ -2861,16 +3134,16 @@ device_parsers:
2861
3134
  # Karbonn
2862
3135
  # @ref: http://www.karbonnmobiles.com/products_tablet.php
2863
3136
  #########
2864
- - regex: '; *Karbonn[ _]?([^;/]+) *(?:Build|;)'
3137
+ - regex: '; {0,2}Karbonn[ _]?([^;/]{1,100}) {0,2}(?:Build|;)'
2865
3138
  regex_flag: 'i'
2866
3139
  device_replacement: '$1'
2867
3140
  brand_replacement: 'Karbonn'
2868
3141
  model_replacement: '$1'
2869
- - regex: '; *([^;]+) Build/Karbonn'
3142
+ - regex: '; {0,2}([^;]{1,200}) Build/Karbonn'
2870
3143
  device_replacement: '$1'
2871
3144
  brand_replacement: 'Karbonn'
2872
3145
  model_replacement: '$1'
2873
- - regex: '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
3146
+ - regex: '; {0,2}(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
2874
3147
  device_replacement: '$1'
2875
3148
  brand_replacement: 'Karbonn'
2876
3149
  model_replacement: '$1'
@@ -2879,84 +3152,84 @@ device_parsers:
2879
3152
  # KDDI (Operator Branded Device)
2880
3153
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2881
3154
  #########
2882
- - regex: '; *(IS01|IS03|IS05|IS\d{2}SH) Build'
3155
+ - regex: '; {0,2}(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
2883
3156
  device_replacement: '$1'
2884
3157
  brand_replacement: 'Sharp'
2885
3158
  model_replacement: '$1'
2886
- - regex: '; *(IS04) Build'
3159
+ - regex: '; {0,2}(IS04)(?: Build|\) AppleWebKit)'
2887
3160
  device_replacement: '$1'
2888
3161
  brand_replacement: 'Regza'
2889
3162
  model_replacement: '$1'
2890
- - regex: '; *(IS06|IS\d{2}PT) Build'
3163
+ - regex: '; {0,2}(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
2891
3164
  device_replacement: '$1'
2892
3165
  brand_replacement: 'Pantech'
2893
3166
  model_replacement: '$1'
2894
- - regex: '; *(IS11S) Build'
3167
+ - regex: '; {0,2}(IS11S)(?: Build|\) AppleWebKit)'
2895
3168
  device_replacement: '$1'
2896
3169
  brand_replacement: 'SonyEricsson'
2897
3170
  model_replacement: 'Xperia Acro'
2898
- - regex: '; *(IS11CA) Build'
3171
+ - regex: '; {0,2}(IS11CA)(?: Build|\) AppleWebKit)'
2899
3172
  device_replacement: '$1'
2900
3173
  brand_replacement: 'Casio'
2901
3174
  model_replacement: 'GzOne $1'
2902
- - regex: '; *(IS11LG) Build'
3175
+ - regex: '; {0,2}(IS11LG)(?: Build|\) AppleWebKit)'
2903
3176
  device_replacement: '$1'
2904
3177
  brand_replacement: 'LG'
2905
3178
  model_replacement: 'Optimus X'
2906
- - regex: '; *(IS11N) Build'
3179
+ - regex: '; {0,2}(IS11N)(?: Build|\) AppleWebKit)'
2907
3180
  device_replacement: '$1'
2908
3181
  brand_replacement: 'Medias'
2909
3182
  model_replacement: '$1'
2910
- - regex: '; *(IS11PT) Build'
3183
+ - regex: '; {0,2}(IS11PT)(?: Build|\) AppleWebKit)'
2911
3184
  device_replacement: '$1'
2912
3185
  brand_replacement: 'Pantech'
2913
3186
  model_replacement: 'MIRACH'
2914
- - regex: '; *(IS12F) Build'
3187
+ - regex: '; {0,2}(IS12F)(?: Build|\) AppleWebKit)'
2915
3188
  device_replacement: '$1'
2916
3189
  brand_replacement: 'Fujitsu'
2917
3190
  model_replacement: 'Arrows ES'
2918
3191
  # @ref: https://ja.wikipedia.org/wiki/IS12M
2919
- - regex: '; *(IS12M) Build'
3192
+ - regex: '; {0,2}(IS12M)(?: Build|\) AppleWebKit)'
2920
3193
  device_replacement: '$1'
2921
3194
  brand_replacement: 'Motorola'
2922
3195
  model_replacement: 'XT909'
2923
- - regex: '; *(IS12S) Build'
3196
+ - regex: '; {0,2}(IS12S)(?: Build|\) AppleWebKit)'
2924
3197
  device_replacement: '$1'
2925
3198
  brand_replacement: 'SonyEricsson'
2926
3199
  model_replacement: 'Xperia Acro HD'
2927
- - regex: '; *(ISW11F) Build'
3200
+ - regex: '; {0,2}(ISW11F)(?: Build|\) AppleWebKit)'
2928
3201
  device_replacement: '$1'
2929
3202
  brand_replacement: 'Fujitsu'
2930
3203
  model_replacement: 'Arrowz Z'
2931
- - regex: '; *(ISW11HT) Build'
3204
+ - regex: '; {0,2}(ISW11HT)(?: Build|\) AppleWebKit)'
2932
3205
  device_replacement: '$1'
2933
3206
  brand_replacement: 'HTC'
2934
3207
  model_replacement: 'EVO'
2935
- - regex: '; *(ISW11K) Build'
3208
+ - regex: '; {0,2}(ISW11K)(?: Build|\) AppleWebKit)'
2936
3209
  device_replacement: '$1'
2937
3210
  brand_replacement: 'Kyocera'
2938
3211
  model_replacement: 'DIGNO'
2939
- - regex: '; *(ISW11M) Build'
3212
+ - regex: '; {0,2}(ISW11M)(?: Build|\) AppleWebKit)'
2940
3213
  device_replacement: '$1'
2941
3214
  brand_replacement: 'Motorola'
2942
3215
  model_replacement: 'Photon'
2943
- - regex: '; *(ISW11SC) Build'
3216
+ - regex: '; {0,2}(ISW11SC)(?: Build|\) AppleWebKit)'
2944
3217
  device_replacement: '$1'
2945
3218
  brand_replacement: 'Samsung'
2946
3219
  model_replacement: 'GALAXY S II WiMAX'
2947
- - regex: '; *(ISW12HT) Build'
3220
+ - regex: '; {0,2}(ISW12HT)(?: Build|\) AppleWebKit)'
2948
3221
  device_replacement: '$1'
2949
3222
  brand_replacement: 'HTC'
2950
3223
  model_replacement: 'EVO 3D'
2951
- - regex: '; *(ISW13HT) Build'
3224
+ - regex: '; {0,2}(ISW13HT)(?: Build|\) AppleWebKit)'
2952
3225
  device_replacement: '$1'
2953
3226
  brand_replacement: 'HTC'
2954
3227
  model_replacement: 'J'
2955
- - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2}) Build'
3228
+ - regex: '; {0,2}(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
2956
3229
  device_replacement: '$1'
2957
3230
  brand_replacement: 'KDDI'
2958
3231
  model_replacement: '$1'
2959
- - regex: '; *(INFOBAR [^;/]+) Build'
3232
+ - regex: '; {0,2}(INFOBAR [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2960
3233
  device_replacement: '$1'
2961
3234
  brand_replacement: 'KDDI'
2962
3235
  model_replacement: '$1'
@@ -2965,7 +3238,7 @@ device_parsers:
2965
3238
  # Kingcom
2966
3239
  # @ref: http://www.e-kingcom.com
2967
3240
  #########
2968
- - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+) Build/'
3241
+ - regex: '; {0,2}(JOYPAD|Joypad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2969
3242
  device_replacement: '$1 $2'
2970
3243
  brand_replacement: 'Kingcom'
2971
3244
  model_replacement: '$1 $2'
@@ -2975,7 +3248,7 @@ device_parsers:
2975
3248
  # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
2976
3249
  # @ref: http://www.kobo.com/devices#tablets
2977
3250
  #########
2978
- - regex: '; *(Vox|VOX|Arc|K080) Build/'
3251
+ - regex: '; {0,2}(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
2979
3252
  regex_flag: 'i'
2980
3253
  device_replacement: '$1'
2981
3254
  brand_replacement: 'Kobo'
@@ -2989,7 +3262,7 @@ device_parsers:
2989
3262
  # K-Touch
2990
3263
  # @ref: ??
2991
3264
  #########
2992
- - regex: '; *(K-Touch)[ _]([^;/]+) Build'
3265
+ - regex: '; {0,2}(K-Touch)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2993
3266
  regex_flag: 'i'
2994
3267
  device_replacement: '$1 $2'
2995
3268
  brand_replacement: 'Ktouch'
@@ -2999,7 +3272,7 @@ device_parsers:
2999
3272
  # KT Tech
3000
3273
  # @ref: http://www.kttech.co.kr
3001
3274
  #########
3002
- - regex: '; *((?:EV|KM)-S\d+[A-Z]?) Build'
3275
+ - regex: '; {0,2}((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3003
3276
  regex_flag: 'i'
3004
3277
  device_replacement: '$1'
3005
3278
  brand_replacement: 'KTtech'
@@ -3009,7 +3282,7 @@ device_parsers:
3009
3282
  # Kyocera
3010
3283
  # @ref: http://www.android.com/devices/?country=all&m=kyocera
3011
3284
  #########
3012
- - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2}) Build/'
3285
+ - regex: '; {0,2}(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3013
3286
  device_replacement: '$1'
3014
3287
  brand_replacement: 'Kyocera'
3015
3288
  model_replacement: '$1'
@@ -3018,12 +3291,12 @@ device_parsers:
3018
3291
  # Lava
3019
3292
  # @ref: http://www.lavamobiles.com/
3020
3293
  #########
3021
- - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
3294
+ - regex: '; {0,2}(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
3022
3295
  regex_flag: 'i'
3023
3296
  device_replacement: 'Iris $1'
3024
3297
  brand_replacement: 'Lava'
3025
3298
  model_replacement: 'Iris $1'
3026
- - regex: '; *LAVA[ _]([^;/]+) Build'
3299
+ - regex: '; {0,2}LAVA[ _]([^;/]{1,100}) Build'
3027
3300
  device_replacement: '$1'
3028
3301
  brand_replacement: 'Lava'
3029
3302
  model_replacement: '$1'
@@ -3032,7 +3305,7 @@ device_parsers:
3032
3305
  # Lemon
3033
3306
  # @ref: http://www.lemonmobiles.com/products.php?type=1
3034
3307
  #########
3035
- - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_? Build'
3308
+ - regex: '; {0,2}(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]{1,100}))_?(?: Build|\) AppleWebKit)'
3036
3309
  device_replacement: 'Lemon $1$2'
3037
3310
  brand_replacement: 'Lemon'
3038
3311
  model_replacement: '$1$2'
@@ -3041,11 +3314,11 @@ device_parsers:
3041
3314
  # Lenco
3042
3315
  # @ref: http://www.lenco.com/c/tablets/
3043
3316
  #########
3044
- - regex: '; *(TAB-1012) Build/'
3317
+ - regex: '; {0,2}(TAB-1012)(?: Build|\) AppleWebKit)'
3045
3318
  device_replacement: 'Lenco $1'
3046
3319
  brand_replacement: 'Lenco'
3047
3320
  model_replacement: '$1'
3048
- - regex: '; Lenco ([^;/]+) Build/'
3321
+ - regex: '; Lenco ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3049
3322
  device_replacement: 'Lenco $1'
3050
3323
  brand_replacement: 'Lenco'
3051
3324
  model_replacement: '$1'
@@ -3054,23 +3327,23 @@ device_parsers:
3054
3327
  # Lenovo
3055
3328
  # @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
3056
3329
  #########
3057
- - regex: '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3330
+ - regex: '; {0,2}(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3058
3331
  device_replacement: '$1'
3059
3332
  brand_replacement: 'Lenovo'
3060
3333
  model_replacement: '$1'
3061
- - regex: '; *(Idea[Tp]ab)[ _]([^;/]+);? Build'
3334
+ - regex: '; {0,2}(Idea[Tp]ab)[ _]([^;/]{1,100});? Build'
3062
3335
  device_replacement: 'Lenovo $1 $2'
3063
3336
  brand_replacement: 'Lenovo'
3064
3337
  model_replacement: '$1 $2'
3065
- - regex: '; *(Idea(?:Tab|pad)) ?([^;/]+) Build'
3338
+ - regex: '; {0,2}(Idea(?:Tab|pad)) ?([^;/]{1,100}) Build'
3066
3339
  device_replacement: 'Lenovo $1 $2'
3067
3340
  brand_replacement: 'Lenovo'
3068
3341
  model_replacement: '$1 $2'
3069
- - regex: '; *(ThinkPad) ?(Tablet) Build/'
3342
+ - regex: '; {0,2}(ThinkPad) ?(Tablet) Build/'
3070
3343
  device_replacement: 'Lenovo $1 $2'
3071
3344
  brand_replacement: 'Lenovo'
3072
3345
  model_replacement: '$1 $2'
3073
- - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
3346
+ - regex: '; {0,2}(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.{1,200}?)(?:Build|[;/\)])'
3074
3347
  device_replacement: 'Lenovo $1'
3075
3348
  brand_replacement: 'Lenovo'
3076
3349
  model_replacement: '$1'
@@ -3078,11 +3351,11 @@ device_parsers:
3078
3351
  device_replacement: 'Lenovo $1 $2 $3'
3079
3352
  brand_replacement: 'Lenovo'
3080
3353
  model_replacement: '$1 $2 $3'
3081
- - regex: '; *(?:Ideapad |)K1 Build/'
3354
+ - regex: '; {0,2}(?:Ideapad |)K1 Build/'
3082
3355
  device_replacement: 'Lenovo Ideapad K1'
3083
3356
  brand_replacement: 'Lenovo'
3084
3357
  model_replacement: 'Ideapad K1'
3085
- - regex: '; *(3GC101|3GW10[01]|A390) Build/'
3358
+ - regex: '; {0,2}(3GC101|3GW10[01]|A390) Build/'
3086
3359
  device_replacement: '$1'
3087
3360
  brand_replacement: 'Lenovo'
3088
3361
  model_replacement: '$1'
@@ -3095,7 +3368,7 @@ device_parsers:
3095
3368
  # Lexibook
3096
3369
  # @ref: http://www.lexibook.com/fr
3097
3370
  #########
3098
- - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),? Build'
3371
+ - regex: '; {0,2}(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3099
3372
  device_replacement: '$1$2'
3100
3373
  brand_replacement: 'Lexibook'
3101
3374
  model_replacement: '$1$2'
@@ -3104,23 +3377,23 @@ device_parsers:
3104
3377
  # LG
3105
3378
  # @ref: http://www.lg.com/uk/mobile
3106
3379
  #########
3107
- - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)'
3380
+ - regex: '; {0,2}(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]{1,30}|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) {0,2}(?:Build|;)'
3108
3381
  device_replacement: '$1'
3109
3382
  brand_replacement: 'LG'
3110
3383
  model_replacement: '$1'
3111
- - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
3384
+ - regex: '[;:] {0,2}(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) {0,2}(?:Build|[;\)])'
3112
3385
  device_replacement: '$1'
3113
3386
  brand_replacement: 'LG'
3114
3387
  model_replacement: '$1'
3115
- - regex: '; *(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3388
+ - regex: '; {0,2}(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3116
3389
  device_replacement: '$1$2'
3117
3390
  brand_replacement: 'LG'
3118
3391
  model_replacement: '$2'
3119
- - regex: '; *(LG[ \-]|LG)([^;/]+)[;/]? Build'
3392
+ - regex: '; {0,2}(LG[ \-]|LG)([^;/]{1,100})[;/]? Build'
3120
3393
  device_replacement: '$1$2'
3121
3394
  brand_replacement: 'LG'
3122
3395
  model_replacement: '$2'
3123
- - regex: '^(LG)-([^;/]+)/ Mozilla/.*; Android'
3396
+ - regex: '^(LG)-([^;/]{1,100})/ Mozilla/.{0,200}; Android'
3124
3397
  device_replacement: '$1 $2'
3125
3398
  brand_replacement: 'LG'
3126
3399
  model_replacement: '$2'
@@ -3133,11 +3406,11 @@ device_parsers:
3133
3406
  # Malata
3134
3407
  # @ref: http://www.malata.com/en/products.aspx?classid=680
3135
3408
  #########
3136
- - regex: '; *((?:SMB|smb)[^;/]+) Build/'
3409
+ - regex: '; {0,2}((?:SMB|smb)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3137
3410
  device_replacement: '$1'
3138
3411
  brand_replacement: 'Malata'
3139
3412
  model_replacement: '$1'
3140
- - regex: '; *(?:Malata|MALATA) ([^;/]+) Build/'
3413
+ - regex: '; {0,2}(?:Malata|MALATA) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3141
3414
  device_replacement: '$1'
3142
3415
  brand_replacement: 'Malata'
3143
3416
  model_replacement: '$1'
@@ -3146,7 +3419,7 @@ device_parsers:
3146
3419
  # Manta
3147
3420
  # @ref: http://www.manta.com.pl/en
3148
3421
  #########
3149
- - regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9]) Build/'
3422
+ - regex: '; {0,2}(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
3150
3423
  device_replacement: '$1'
3151
3424
  brand_replacement: 'Manta'
3152
3425
  model_replacement: '$1'
@@ -3155,7 +3428,7 @@ device_parsers:
3155
3428
  # Match
3156
3429
  # @ref: http://www.match.net.cn/products.asp
3157
3430
  #########
3158
- - regex: '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980) Build/'
3431
+ - regex: '; {0,2}(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\) AppleWebKit)'
3159
3432
  device_replacement: '$1'
3160
3433
  brand_replacement: 'Match'
3161
3434
  model_replacement: '$1'
@@ -3169,7 +3442,7 @@ device_parsers:
3169
3442
  # Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
3170
3443
  # @note: Need more User-Agents!!!
3171
3444
  #########
3172
- - regex: '; *(GenxDroid7|MSD7.*|AX\d.*|Tab 701|Tab 722) Build/'
3445
+ - regex: '; {0,2}(GenxDroid7|MSD7.{0,200}?|AX\d.{0,200}?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3173
3446
  device_replacement: 'Maxx $1'
3174
3447
  brand_replacement: 'Maxx'
3175
3448
  model_replacement: '$1'
@@ -3178,11 +3451,11 @@ device_parsers:
3178
3451
  # Mediacom
3179
3452
  # @ref: http://www.mediacomeurope.it/
3180
3453
  #########
3181
- - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+) Build'
3454
+ - regex: '; {0,2}(M-PP[^;/]{1,30}|PhonePad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3182
3455
  device_replacement: 'Mediacom $1'
3183
3456
  brand_replacement: 'Mediacom'
3184
3457
  model_replacement: '$1'
3185
- - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+) Build'
3458
+ - regex: '; {0,2}(M-MP[^;/]{1,30}|SmartPad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3186
3459
  device_replacement: 'Mediacom $1'
3187
3460
  brand_replacement: 'Mediacom'
3188
3461
  model_replacement: '$1'
@@ -3191,12 +3464,12 @@ device_parsers:
3191
3464
  # Medion
3192
3465
  # @ref: http://www.medion.com/en/
3193
3466
  #########
3194
- - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+) Build'
3467
+ - regex: '; {0,2}(?:MD_|)LIFETAB[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3195
3468
  regex_flag: 'i'
3196
3469
  device_replacement: 'Medion Lifetab $1'
3197
3470
  brand_replacement: 'Medion'
3198
3471
  model_replacement: 'Lifetab $1'
3199
- - regex: '; *MEDION ([^;/]+) Build'
3472
+ - regex: '; {0,2}MEDION ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3200
3473
  device_replacement: 'Medion $1'
3201
3474
  brand_replacement: 'Medion'
3202
3475
  model_replacement: '$1'
@@ -3205,11 +3478,11 @@ device_parsers:
3205
3478
  # Meizu
3206
3479
  # @ref: http://www.meizu.com
3207
3480
  #########
3208
- - regex: '; *(M030|M031|M035|M040|M065|m9) Build'
3481
+ - regex: '; {0,2}(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3209
3482
  device_replacement: 'Meizu $1'
3210
3483
  brand_replacement: 'Meizu'
3211
3484
  model_replacement: '$1'
3212
- - regex: '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\)])'
3485
+ - regex: '; {0,2}(?:meizu_|MEIZU )(.{1,200}?) {0,2}(?:Build|[;\)])'
3213
3486
  device_replacement: 'Meizu $1'
3214
3487
  brand_replacement: 'Meizu'
3215
3488
  model_replacement: '$1'
@@ -3218,28 +3491,28 @@ device_parsers:
3218
3491
  # Micromax
3219
3492
  # @ref: http://www.micromaxinfo.com
3220
3493
  #########
3221
- - regex: '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3494
+ - regex: '; {0,2}(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3222
3495
  regex_flag: 'i'
3223
3496
  device_replacement: 'Micromax $1$2'
3224
3497
  brand_replacement: 'Micromax'
3225
3498
  model_replacement: '$1$2'
3226
- - regex: '; *Micromax[ _](A\d{2,3}[^;/]*) Build'
3499
+ - regex: '; {0,2}Micromax[ _](A\d{2,3}[^;/]*) Build'
3227
3500
  regex_flag: 'i'
3228
3501
  device_replacement: 'Micromax $1'
3229
3502
  brand_replacement: 'Micromax'
3230
3503
  model_replacement: '$1'
3231
3504
  # be carefull here with Acer e.g. A500
3232
- - regex: '; *(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3505
+ - regex: '; {0,2}(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3233
3506
  regex_flag: 'i'
3234
3507
  device_replacement: 'Micromax $1'
3235
3508
  brand_replacement: 'Micromax'
3236
3509
  model_replacement: '$1'
3237
- - regex: '; *Micromax[ _](P\d{3}[^;/]*) Build'
3510
+ - regex: '; {0,2}Micromax[ _](P\d{3}[^;/]*) Build'
3238
3511
  regex_flag: 'i'
3239
3512
  device_replacement: 'Micromax $1'
3240
3513
  brand_replacement: 'Micromax'
3241
3514
  model_replacement: '$1'
3242
- - regex: '; *(P\d{3}|P\d{3}\(Funbook\)) Build'
3515
+ - regex: '; {0,2}(P\d{3}|P\d{3}\(Funbook\)) Build'
3243
3516
  regex_flag: 'i'
3244
3517
  device_replacement: 'Micromax $1'
3245
3518
  brand_replacement: 'Micromax'
@@ -3249,7 +3522,7 @@ device_parsers:
3249
3522
  # Mito
3250
3523
  # @ref: http://new.mitomobile.com/
3251
3524
  #########
3252
- - regex: '; *(MITO)[ _\-]?([^;/]+) Build'
3525
+ - regex: '; {0,2}(MITO)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3253
3526
  regex_flag: 'i'
3254
3527
  device_replacement: '$1 $2'
3255
3528
  brand_replacement: 'Mito'
@@ -3259,7 +3532,7 @@ device_parsers:
3259
3532
  # Mobistel
3260
3533
  # @ref: http://www.mobistel.com/
3261
3534
  #########
3262
- - regex: '; *(Cynus)[ _](F5|T\d|.+?) *(?:Build|[;/\)])'
3535
+ - regex: '; {0,2}(Cynus)[ _](F5|T\d|.{1,200}?) {0,2}(?:Build|[;/\)])'
3263
3536
  regex_flag: 'i'
3264
3537
  device_replacement: '$1 $2'
3265
3538
  brand_replacement: 'Mobistel'
@@ -3269,12 +3542,12 @@ device_parsers:
3269
3542
  # Modecom
3270
3543
  # @ref: http://www.modecom.eu/tablets/portal/
3271
3544
  #########
3272
- - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+) Build'
3545
+ - regex: '; {0,2}(MODECOM |)(FreeTab) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3273
3546
  regex_flag: 'i'
3274
3547
  device_replacement: '$1$2 $3'
3275
3548
  brand_replacement: 'Modecom'
3276
3549
  model_replacement: '$2 $3'
3277
- - regex: '; *(MODECOM )([^;/]+) Build'
3550
+ - regex: '; {0,2}(MODECOM )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3278
3551
  regex_flag: 'i'
3279
3552
  device_replacement: '$1 $2'
3280
3553
  brand_replacement: 'Modecom'
@@ -3284,32 +3557,32 @@ device_parsers:
3284
3557
  # Motorola
3285
3558
  # @ref: http://www.motorola.com/us/shop-all-mobile-phones/
3286
3559
  #########
3287
- - regex: '; *(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3560
+ - regex: '; {0,2}(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3288
3561
  device_replacement: 'Motorola $1'
3289
3562
  brand_replacement: 'Motorola'
3290
3563
  model_replacement: '$1'
3291
- - regex: '; *(Milestone )(XT[^;/]*) Build'
3564
+ - regex: '; {0,2}(Milestone )(XT[^;/]*) Build'
3292
3565
  device_replacement: 'Motorola $1$2'
3293
3566
  brand_replacement: 'Motorola'
3294
3567
  model_replacement: '$2'
3295
- - regex: '; *(Motoroi ?x|Droid X|DROIDX) Build'
3568
+ - regex: '; {0,2}(Motoroi ?x|Droid X|DROIDX) Build'
3296
3569
  regex_flag: 'i'
3297
3570
  device_replacement: 'Motorola $1'
3298
3571
  brand_replacement: 'Motorola'
3299
3572
  model_replacement: 'DROID X'
3300
- - regex: '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3573
+ - regex: '; {0,2}(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3301
3574
  device_replacement: 'Motorola $1'
3302
3575
  brand_replacement: 'Motorola'
3303
3576
  model_replacement: '$1'
3304
- - regex: '; *(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
3577
+ - regex: '; {0,2}(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
3305
3578
  device_replacement: '$1'
3306
3579
  brand_replacement: 'Motorola'
3307
3580
  model_replacement: '$1'
3308
- - regex: '; *(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]+) Build'
3581
+ - regex: '; {0,2}(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]{1,100}) Build'
3309
3582
  device_replacement: '$1$2'
3310
3583
  brand_replacement: 'Motorola'
3311
3584
  model_replacement: '$2'
3312
- - regex: '; *(Moto[_ ]?|MOT\-)([^;/]+) Build'
3585
+ - regex: '; {0,2}(Moto[_ ]?|MOT\-)([^;/]{1,100}) Build'
3313
3586
  device_replacement: '$1$2'
3314
3587
  brand_replacement: 'Motorola'
3315
3588
  model_replacement: '$2'
@@ -3318,7 +3591,7 @@ device_parsers:
3318
3591
  # MpMan
3319
3592
  # @ref: http://www.mpmaneurope.com
3320
3593
  #########
3321
- - regex: '; *((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*) Build'
3594
+ - regex: '; {0,2}((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\) AppleWebKit)'
3322
3595
  device_replacement: '$1'
3323
3596
  brand_replacement: 'Mpman'
3324
3597
  model_replacement: '$1'
@@ -3327,7 +3600,7 @@ device_parsers:
3327
3600
  # MSI
3328
3601
  # @ref: http://www.msi.com/product/windpad/
3329
3602
  #########
3330
- - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+) Build'
3603
+ - regex: '; {0,2}(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3331
3604
  regex_flag: 'i'
3332
3605
  device_replacement: '$1'
3333
3606
  brand_replacement: 'Msi'
@@ -3337,7 +3610,7 @@ device_parsers:
3337
3610
  # Multilaser
3338
3611
  # http://www.multilaser.com.br/listagem_produtos.php?cat=5
3339
3612
  #########
3340
- - regex: '; *Multilaser[ _]([^;/]+) Build'
3613
+ - regex: '; {0,2}Multilaser[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3341
3614
  device_replacement: '$1'
3342
3615
  brand_replacement: 'Multilaser'
3343
3616
  model_replacement: '$1'
@@ -3346,15 +3619,15 @@ device_parsers:
3346
3619
  # MyPhone
3347
3620
  # @ref: http://myphone.com.ph/
3348
3621
  #########
3349
- - regex: '; *(My)[_]?(Pad)[ _]([^;/]+) Build'
3622
+ - regex: '; {0,2}(My)[_]?(Pad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3350
3623
  device_replacement: '$1$2 $3'
3351
3624
  brand_replacement: 'MyPhone'
3352
3625
  model_replacement: '$1$2 $3'
3353
- - regex: '; *(My)\|?(Phone)[ _]([^;/]+) Build'
3626
+ - regex: '; {0,2}(My)\|?(Phone)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3354
3627
  device_replacement: '$1$2 $3'
3355
3628
  brand_replacement: 'MyPhone'
3356
3629
  model_replacement: '$3'
3357
- - regex: '; *(A\d+)[ _](Duo|) Build'
3630
+ - regex: '; {0,2}(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3358
3631
  regex_flag: 'i'
3359
3632
  device_replacement: '$1 $2'
3360
3633
  brand_replacement: 'MyPhone'
@@ -3364,7 +3637,7 @@ device_parsers:
3364
3637
  # Mytab
3365
3638
  # @ref: http://www.mytab.eu/en/category/mytab-products/
3366
3639
  #########
3367
- - regex: '; *(myTab[^;/]*) Build'
3640
+ - regex: '; {0,2}(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3368
3641
  device_replacement: '$1'
3369
3642
  brand_replacement: 'Mytab'
3370
3643
  model_replacement: '$1'
@@ -3373,7 +3646,7 @@ device_parsers:
3373
3646
  # Nabi
3374
3647
  # @ref: https://www.nabitablet.com
3375
3648
  #########
3376
- - regex: '; *(NABI2?-)([^;/]+) Build/'
3649
+ - regex: '; {0,2}(NABI2?-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3377
3650
  device_replacement: '$1$2'
3378
3651
  brand_replacement: 'Nabi'
3379
3652
  model_replacement: '$2'
@@ -3382,15 +3655,15 @@ device_parsers:
3382
3655
  # Nec Medias
3383
3656
  # @ref: http://www.n-keitai.com/
3384
3657
  #########
3385
- - regex: '; *(N-\d+[CDE]) Build/'
3658
+ - regex: '; {0,2}(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3386
3659
  device_replacement: '$1'
3387
3660
  brand_replacement: 'Nec'
3388
3661
  model_replacement: '$1'
3389
- - regex: '; ?(NEC-)(.*) Build/'
3662
+ - regex: '; ?(NEC-)(.{0,200}?)(?: Build|\) AppleWebKit)'
3390
3663
  device_replacement: '$1$2'
3391
3664
  brand_replacement: 'Nec'
3392
3665
  model_replacement: '$2'
3393
- - regex: '; *(LT-NA7) Build/'
3666
+ - regex: '; {0,2}(LT-NA7)(?: Build|\) AppleWebKit)'
3394
3667
  device_replacement: '$1'
3395
3668
  brand_replacement: 'Nec'
3396
3669
  model_replacement: 'Lifetouch Note'
@@ -3399,7 +3672,7 @@ device_parsers:
3399
3672
  # Nextbook
3400
3673
  # @ref: http://nextbookusa.com
3401
3674
  #########
3402
- - regex: '; *(NXM\d+[A-z0-9_]*|Next\d[A-z0-9_ \-]*|NEXT\d[A-z0-9_ \-]*|Nextbook [A-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
3675
+ - regex: '; {0,2}(NXM\d+[A-Za-z0-9_]{0,50}|Next\d[A-Za-z0-9_ \-]{0,50}|NEXT\d[A-Za-z0-9_ \-]{0,50}|Nextbook [A-Za-z0-9_ ]{0,50}|DATAM803HC|M805)(?: Build|[\);])'
3403
3676
  device_replacement: '$1'
3404
3677
  brand_replacement: 'Nextbook'
3405
3678
  model_replacement: '$1'
@@ -3408,22 +3681,26 @@ device_parsers:
3408
3681
  # Nokia
3409
3682
  # @ref: http://www.nokia.com
3410
3683
  #########
3411
- - regex: '; *(Nokia)([ _\-]*)([^;/]*) Build'
3684
+ - regex: '; {0,2}(Nokia)([ _\-]{0,5})([^;/]{0,50}) Build'
3412
3685
  regex_flag: 'i'
3413
3686
  device_replacement: '$1$2$3'
3414
3687
  brand_replacement: 'Nokia'
3415
3688
  model_replacement: '$3'
3689
+ - regex: '; {0,2}(TA\-\d{4})(?: Build|\) AppleWebKit)'
3690
+ device_replacement: 'Nokia $1'
3691
+ brand_replacement: 'Nokia'
3692
+ model_replacement: '$1'
3416
3693
 
3417
3694
  #########
3418
3695
  # Nook
3419
3696
  # @ref:
3420
3697
  # TODO nook browser/1.0
3421
3698
  #########
3422
- - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+) Build'
3699
+ - regex: '; {0,2}(Nook ?|Barnes & Noble Nook |BN )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3423
3700
  device_replacement: '$1$2'
3424
3701
  brand_replacement: 'Nook'
3425
3702
  model_replacement: '$2'
3426
- - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build'
3703
+ - regex: '; {0,2}(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3427
3704
  device_replacement: '$1$2'
3428
3705
  brand_replacement: 'Nook'
3429
3706
  model_replacement: '$2'
@@ -3436,7 +3713,7 @@ device_parsers:
3436
3713
  # Olivetti
3437
3714
  # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
3438
3715
  #########
3439
- - regex: '; *(OP110|OliPad[^;/]+) Build'
3716
+ - regex: '; {0,2}(OP110|OliPad[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3440
3717
  device_replacement: 'Olivetti $1'
3441
3718
  brand_replacement: 'Olivetti'
3442
3719
  model_replacement: '$1'
@@ -3447,7 +3724,7 @@ device_parsers:
3447
3724
  # @note: MID tablets might get matched by CobyKyros first
3448
3725
  # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
3449
3726
  #########
3450
- - regex: '; *OMEGA[ _\-](MID[^;/]+) Build'
3727
+ - regex: '; {0,2}OMEGA[ _\-](MID[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3451
3728
  device_replacement: 'Omega $1'
3452
3729
  brand_replacement: 'Omega'
3453
3730
  model_replacement: '$1'
@@ -3460,7 +3737,7 @@ device_parsers:
3460
3737
  # OpenPeak
3461
3738
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
3462
3739
  #########
3463
- - regex: '; *((?:CIUS|cius)[^;/]*) Build'
3740
+ - regex: '; {0,2}((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3464
3741
  device_replacement: 'Openpeak $1'
3465
3742
  brand_replacement: 'Openpeak'
3466
3743
  model_replacement: '$1'
@@ -3469,33 +3746,40 @@ device_parsers:
3469
3746
  # Oppo
3470
3747
  # @ref: http://en.oppo.com/products/
3471
3748
  #########
3472
- - regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d{0,1}|U70\d{1,2}T?|X90\d{1,2}) Build'
3749
+ - regex: '; {0,2}(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d?|U70\d{1,2}T?|X90\d{1,2}|[AFR]\d{1,2}[a-z]{1,2})(?: Build|\) AppleWebKit)'
3473
3750
  device_replacement: 'Oppo $1'
3474
3751
  brand_replacement: 'Oppo'
3475
3752
  model_replacement: '$1'
3476
- - regex: '; *OPPO ?([^;/]+) Build/'
3753
+ - regex: '; {0,2}OPPO ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3477
3754
  device_replacement: 'Oppo $1'
3478
3755
  brand_replacement: 'Oppo'
3479
3756
  model_replacement: '$1'
3757
+ - regex: '; {0,2}(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3758
+ device_replacement: 'Oppo $1'
3759
+ brand_replacement: 'Oppo'
3760
+ - regex: '; {0,2}(A1601)(?: Build|\) AppleWebKit)'
3761
+ device_replacement: 'Oppo F1s'
3762
+ brand_replacement: 'Oppo'
3763
+ model_replacement: '$1'
3480
3764
 
3481
3765
  #########
3482
3766
  # Odys
3483
3767
  # @ref: http://odys.de
3484
3768
  #########
3485
- - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+) Build'
3769
+ - regex: '; {0,2}(?:Odys\-|ODYS\-|ODYS )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3486
3770
  device_replacement: 'Odys $1'
3487
3771
  brand_replacement: 'Odys'
3488
3772
  model_replacement: '$1'
3489
- - regex: '; *(SELECT) ?(7) Build'
3773
+ - regex: '; {0,2}(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3490
3774
  device_replacement: 'Odys $1 $2'
3491
3775
  brand_replacement: 'Odys'
3492
3776
  model_replacement: '$1 $2'
3493
- - regex: '; *(PEDI)_(PLUS)_(W) Build'
3777
+ - regex: '; {0,2}(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3494
3778
  device_replacement: 'Odys $1 $2 $3'
3495
3779
  brand_replacement: 'Odys'
3496
3780
  model_replacement: '$1 $2 $3'
3497
3781
  # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
3498
- - regex: '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO) Build'
3782
+ - regex: '; {0,2}(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\) AppleWebKit)'
3499
3783
  device_replacement: 'Odys $1'
3500
3784
  brand_replacement: 'Odys'
3501
3785
  model_replacement: '$1'
@@ -3504,11 +3788,11 @@ device_parsers:
3504
3788
  # OnePlus
3505
3789
  # @ref https://oneplus.net/
3506
3790
  #########
3507
- - regex: '; (ONE [a-zA-Z]\d+) Build/'
3791
+ - regex: '; (ONE [a-zA-Z]\d+)(?: Build|\) AppleWebKit)'
3508
3792
  device_replacement: 'OnePlus $1'
3509
3793
  brand_replacement: 'OnePlus'
3510
3794
  model_replacement: '$1'
3511
- - regex: '; (ONEPLUS [a-zA-Z]\d+)(?: Build/|)'
3795
+ - regex: '; (ONEPLUS [a-zA-Z]\d+)(?: Build|\) AppleWebKit)'
3512
3796
  device_replacement: 'OnePlus $1'
3513
3797
  brand_replacement: 'OnePlus'
3514
3798
  model_replacement: '$1'
@@ -3517,7 +3801,7 @@ device_parsers:
3517
3801
  # Orion
3518
3802
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
3519
3803
  #########
3520
- - regex: '; *(TP-\d+) Build/'
3804
+ - regex: '; {0,2}(TP-\d+)(?: Build|\) AppleWebKit)'
3521
3805
  device_replacement: 'Orion $1'
3522
3806
  brand_replacement: 'Orion'
3523
3807
  model_replacement: '$1'
@@ -3526,7 +3810,7 @@ device_parsers:
3526
3810
  # PackardBell
3527
3811
  # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
3528
3812
  #########
3529
- - regex: '; *(G100W?) Build/'
3813
+ - regex: '; {0,2}(G100W?)(?: Build|\) AppleWebKit)'
3530
3814
  device_replacement: 'PackardBell $1'
3531
3815
  brand_replacement: 'PackardBell'
3532
3816
  model_replacement: '$1'
@@ -3537,17 +3821,17 @@ device_parsers:
3537
3821
  # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
3538
3822
  # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
3539
3823
  #########
3540
- - regex: '; *(Panasonic)[_ ]([^;/]+) Build'
3824
+ - regex: '; {0,2}(Panasonic)[_ ]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3541
3825
  device_replacement: '$1 $2'
3542
3826
  brand_replacement: '$1'
3543
3827
  model_replacement: '$2'
3544
3828
  # Toughpad
3545
- - regex: '; *(FZ-A1B|JT-B1) Build'
3829
+ - regex: '; {0,2}(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3546
3830
  device_replacement: 'Panasonic $1'
3547
3831
  brand_replacement: 'Panasonic'
3548
3832
  model_replacement: '$1'
3549
3833
  # Eluga Power
3550
- - regex: '; *(dL1|DL1) Build'
3834
+ - regex: '; {0,2}(dL1|DL1)(?: Build|\) AppleWebKit)'
3551
3835
  device_replacement: 'Panasonic $1'
3552
3836
  brand_replacement: 'Panasonic'
3553
3837
  model_replacement: '$1'
@@ -3558,15 +3842,15 @@ device_parsers:
3558
3842
  # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
3559
3843
  # @models: ADR8995, ADR910L, ADR930VW, C790, CDM8992, CDM8999, IS06, IS11PT, P2000, P2020, P2030, P4100, P5000, P6010, P6020, P6030, P7000, P7040, P8000, P8010, P9020, P9050, P9060, P9070, P9090, PT001, PT002, PT003, TXT8040, TXT8045, VEGA PTL21
3560
3844
  #########
3561
- - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
3845
+ - regex: '; {0,2}(SKY[ _]|)(IM\-[AT]\d{3}[^;/]{1,100}).{0,30} Build/'
3562
3846
  device_replacement: 'Pantech $1$2'
3563
3847
  brand_replacement: 'Pantech'
3564
3848
  model_replacement: '$1$2'
3565
- - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3849
+ - regex: '; {0,2}((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3566
3850
  device_replacement: '$1'
3567
3851
  brand_replacement: 'Pantech'
3568
3852
  model_replacement: '$1'
3569
- - regex: '; *Pantech([^;/]+).* Build/'
3853
+ - regex: '; {0,2}Pantech([^;/]{1,30}).{0,200}? Build/'
3570
3854
  device_replacement: 'Pantech $1'
3571
3855
  brand_replacement: 'Pantech'
3572
3856
  model_replacement: '$1'
@@ -3575,7 +3859,7 @@ device_parsers:
3575
3859
  # Papayre
3576
3860
  # @ref: http://grammata.es/
3577
3861
  #########
3578
- - regex: '; *(papyre)[ _\-]([^;/]+) Build/'
3862
+ - regex: '; {0,2}(papyre)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3579
3863
  regex_flag: 'i'
3580
3864
  device_replacement: '$1 $2'
3581
3865
  brand_replacement: 'Papyre'
@@ -3585,7 +3869,7 @@ device_parsers:
3585
3869
  # Pearl
3586
3870
  # @ref: http://www.pearl.de/c-1540.shtml
3587
3871
  #########
3588
- - regex: '; *(?:Touchlet )?(X10\.[^;/]+) Build/'
3872
+ - regex: '; {0,2}(?:Touchlet )?(X10\.[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3589
3873
  device_replacement: 'Pearl $1'
3590
3874
  brand_replacement: 'Pearl'
3591
3875
  model_replacement: '$1'
@@ -3594,15 +3878,15 @@ device_parsers:
3594
3878
  # Phicomm
3595
3879
  # @ref: http://www.phicomm.com.cn/
3596
3880
  #########
3597
- - regex: '; PHICOMM (i800) Build/'
3881
+ - regex: '; PHICOMM (i800)(?: Build|\) AppleWebKit)'
3598
3882
  device_replacement: 'Phicomm $1'
3599
3883
  brand_replacement: 'Phicomm'
3600
3884
  model_replacement: '$1'
3601
- - regex: '; PHICOMM ([^;/]+) Build/'
3885
+ - regex: '; PHICOMM ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3602
3886
  device_replacement: 'Phicomm $1'
3603
3887
  brand_replacement: 'Phicomm'
3604
3888
  model_replacement: '$1'
3605
- - regex: '; *(FWS\d{3}[^;/]+) Build/'
3889
+ - regex: '; {0,2}(FWS\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3606
3890
  device_replacement: 'Phicomm $1'
3607
3891
  brand_replacement: 'Phicomm'
3608
3892
  model_replacement: '$1'
@@ -3614,11 +3898,11 @@ device_parsers:
3614
3898
  # @ref: http://www.support.philips.com/support/catalog/products.jsp?_dyncharset=UTF-8&country=&categoryid=ENTERTAINMENT_TABLETS_SU_CN_CARE&userLanguage=en&navCount=0&groupId=&catalogType=&navAction=push&userCountry=cn&title=Entertainment+Tablets&cateId=TABLETS_CA_CN_CARE
3615
3899
  #########
3616
3900
  # @note: this a best guess according to available philips models. Need more User-Agents
3617
- - regex: '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930) Build'
3901
+ - regex: '; {0,2}(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\) AppleWebKit)'
3618
3902
  device_replacement: '$1'
3619
3903
  brand_replacement: 'Philips'
3620
3904
  model_replacement: '$1'
3621
- - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+) Build'
3905
+ - regex: '; {0,2}(?:Philips|PHILIPS)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3622
3906
  device_replacement: 'Philips $1'
3623
3907
  brand_replacement: 'Philips'
3624
3908
  model_replacement: '$1'
@@ -3627,7 +3911,7 @@ device_parsers:
3627
3911
  # Pipo
3628
3912
  # @ref: http://www.pipo.cn/En/
3629
3913
  #########
3630
- - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)? Build'
3914
+ - regex: 'Android 4\..{0,200}; {0,2}(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3631
3915
  device_replacement: 'Pipo $1$2'
3632
3916
  brand_replacement: 'Pipo'
3633
3917
  model_replacement: '$1$2'
@@ -3636,7 +3920,7 @@ device_parsers:
3636
3920
  # Ployer
3637
3921
  # @ref: http://en.ployer.cn/
3638
3922
  #########
3639
- - regex: '; *(MOMO[^;/]+) Build'
3923
+ - regex: '; {0,2}(MOMO[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3640
3924
  device_replacement: '$1'
3641
3925
  brand_replacement: 'Ployer'
3642
3926
  model_replacement: '$1'
@@ -3645,11 +3929,11 @@ device_parsers:
3645
3929
  # Polaroid/ Acho
3646
3930
  # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
3647
3931
  #########
3648
- - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*|) Build/'
3932
+ - regex: '; {0,2}(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]{0,30}?)(\/[^;/]{0,30}|)(?: Build|\) AppleWebKit)'
3649
3933
  device_replacement: '$1'
3650
3934
  brand_replacement: 'Polaroid'
3651
3935
  model_replacement: '$1'
3652
- - regex: '; *(?:Polaroid )(Tablet) Build/'
3936
+ - regex: '; {0,2}(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3653
3937
  device_replacement: '$1'
3654
3938
  brand_replacement: 'Polaroid'
3655
3939
  model_replacement: '$1'
@@ -3659,7 +3943,7 @@ device_parsers:
3659
3943
  # @ref: http://pompmobileshop.com/
3660
3944
  #########
3661
3945
  #~ TODO
3662
- - regex: '; *(POMP)[ _\-](.+?) *(?:Build|[;/\)])'
3946
+ - regex: '; {0,2}(POMP)[ _\-](.{1,200}?) {0,2}(?:Build|[;/\)])'
3663
3947
  device_replacement: '$1 $2'
3664
3948
  brand_replacement: 'Pomp'
3665
3949
  model_replacement: '$2'
@@ -3668,11 +3952,11 @@ device_parsers:
3668
3952
  # Positivo
3669
3953
  # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
3670
3954
  #########
3671
- - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA) Build/'
3955
+ - regex: '; {0,2}(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3672
3956
  device_replacement: '$1'
3673
3957
  brand_replacement: 'Positivo'
3674
3958
  model_replacement: '$1'
3675
- - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+) Build/'
3959
+ - regex: '; {0,2}(?:Positivo |)((?:YPY|Ypy)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3676
3960
  device_replacement: '$1'
3677
3961
  brand_replacement: 'Positivo'
3678
3962
  model_replacement: '$1'
@@ -3682,15 +3966,15 @@ device_parsers:
3682
3966
  # @ref: http://www.pointofview-online.com/default2.php
3683
3967
  # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
3684
3968
  #########
3685
- - regex: '; *(MOB-[^;/]+) Build/'
3969
+ - regex: '; {0,2}(MOB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3686
3970
  device_replacement: '$1'
3687
3971
  brand_replacement: 'POV'
3688
3972
  model_replacement: '$1'
3689
- - regex: '; *POV[ _\-]([^;/]+) Build/'
3973
+ - regex: '; {0,2}POV[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3690
3974
  device_replacement: 'POV $1'
3691
3975
  brand_replacement: 'POV'
3692
3976
  model_replacement: '$1'
3693
- - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*) Build/'
3977
+ - regex: '; {0,2}((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3694
3978
  device_replacement: 'POV $1'
3695
3979
  brand_replacement: 'POV'
3696
3980
  model_replacement: '$1'
@@ -3700,7 +3984,7 @@ device_parsers:
3700
3984
  # @ref: http://www.prestigio.com/catalogue/MultiPhones
3701
3985
  # @ref: http://www.prestigio.com/catalogue/MultiPads
3702
3986
  #########
3703
- - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+) Build/'
3987
+ - regex: '; {0,2}(?:Prestigio |)((?:PAP|PMP)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3704
3988
  device_replacement: 'Prestigio $1'
3705
3989
  brand_replacement: 'Prestigio'
3706
3990
  model_replacement: '$1'
@@ -3709,7 +3993,7 @@ device_parsers:
3709
3993
  # Proscan
3710
3994
  # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
3711
3995
  #########
3712
- - regex: '; *(PLT[0-9]{4}.*) Build/'
3996
+ - regex: '; {0,2}(PLT[0-9]{4}.{0,200}?)(?: Build|\) AppleWebKit)'
3713
3997
  device_replacement: '$1'
3714
3998
  brand_replacement: 'Proscan'
3715
3999
  model_replacement: '$1'
@@ -3718,15 +4002,15 @@ device_parsers:
3718
4002
  # QMobile
3719
4003
  # @ref: http://www.qmobile.com.pk/
3720
4004
  #########
3721
- - regex: '; *(A2|A5|A8|A900)_?(Classic|) Build'
4005
+ - regex: '; {0,2}(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
3722
4006
  device_replacement: '$1 $2'
3723
4007
  brand_replacement: 'Qmobile'
3724
4008
  model_replacement: '$1 $2'
3725
- - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+) Build'
4009
+ - regex: '; {0,2}(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
3726
4010
  device_replacement: 'Qmobile $2 $3'
3727
4011
  brand_replacement: 'Qmobile'
3728
4012
  model_replacement: '$2 $3'
3729
- - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+) Build'
4013
+ - regex: '; {0,2}(Q\-?[Mm]obile)[_ ](A[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3730
4014
  device_replacement: 'Qmobile $2'
3731
4015
  brand_replacement: 'Qmobile'
3732
4016
  model_replacement: '$2'
@@ -3735,11 +4019,11 @@ device_parsers:
3735
4019
  # Qmobilevn
3736
4020
  # @ref: http://qmobile.vn/san-pham.html
3737
4021
  #########
3738
- - regex: '; *(Q\-Smart)[ _]([^;/]+) Build/'
4022
+ - regex: '; {0,2}(Q\-Smart)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3739
4023
  device_replacement: '$1 $2'
3740
4024
  brand_replacement: 'Qmobilevn'
3741
4025
  model_replacement: '$2'
3742
- - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+) Build/'
4026
+ - regex: '; {0,2}(Q\-?[Mm]obile)[ _\-](S[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3743
4027
  device_replacement: '$1 $2'
3744
4028
  brand_replacement: 'Qmobilevn'
3745
4029
  model_replacement: '$2'
@@ -3748,7 +4032,7 @@ device_parsers:
3748
4032
  # Quanta
3749
4033
  # @ref: ?
3750
4034
  #########
3751
- - regex: '; *(TA1013) Build'
4035
+ - regex: '; {0,2}(TA1013)(?: Build|\) AppleWebKit)'
3752
4036
  device_replacement: '$1'
3753
4037
  brand_replacement: 'Quanta'
3754
4038
  model_replacement: '$1'
@@ -3757,11 +4041,11 @@ device_parsers:
3757
4041
  # RCA
3758
4042
  # @ref: http://rcamobilephone.com/
3759
4043
  #########
3760
- - regex: '; (RCT\w+) Build/'
4044
+ - regex: '; (RCT\w+)(?: Build|\) AppleWebKit)'
3761
4045
  device_replacement: '$1'
3762
4046
  brand_replacement: 'RCA'
3763
4047
  model_replacement: '$1'
3764
- - regex: '; RCA (\w+) Build/'
4048
+ - regex: '; RCA (\w+)(?: Build|\) AppleWebKit)'
3765
4049
  device_replacement: 'RCA $1'
3766
4050
  brand_replacement: 'RCA'
3767
4051
  model_replacement: '$1'
@@ -3771,7 +4055,7 @@ device_parsers:
3771
4055
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
3772
4056
  # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
3773
4057
  #########
3774
- - regex: '; *(RK\d+),? Build/'
4058
+ - regex: '; {0,2}(RK\d+),?(?: Build|\) AppleWebKit)'
3775
4059
  device_replacement: '$1'
3776
4060
  brand_replacement: 'Rockchip'
3777
4061
  model_replacement: '$1'
@@ -3784,55 +4068,55 @@ device_parsers:
3784
4068
  # Samsung Android Devices
3785
4069
  # @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
3786
4070
  #########
3787
- - regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
4071
+ - regex: '; {0,2}(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]{0,100})\/?[^;/]{0,50} Build/'
3788
4072
  device_replacement: 'Samsung $1$2'
3789
4073
  brand_replacement: 'Samsung'
3790
4074
  model_replacement: '$2'
3791
- - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
4075
+ - regex: '; {0,2}(Google |)(Nexus [Ss](?: 4G|)) Build/'
3792
4076
  device_replacement: 'Samsung $1$2'
3793
4077
  brand_replacement: 'Samsung'
3794
4078
  model_replacement: '$2'
3795
- - regex: '; *(SAMSUNG |Samsung )([^\/]*)\/[^ ]* Build/'
4079
+ - regex: '; {0,2}(SAMSUNG |Samsung )([^\/]{0,50})\/[^ ]{0,50} Build/'
3796
4080
  device_replacement: 'Samsung $2'
3797
4081
  brand_replacement: 'Samsung'
3798
4082
  model_replacement: '$2'
3799
- - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
4083
+ - regex: '; {0,2}(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
3800
4084
  device_replacement: 'Samsung $1'
3801
4085
  brand_replacement: 'Samsung'
3802
4086
  model_replacement: '$1'
3803
- - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
4087
+ - regex: '; {0,2}(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]{1,100}) Build'
3804
4088
  device_replacement: 'Samsung $2'
3805
4089
  brand_replacement: 'Samsung'
3806
4090
  model_replacement: '$2'
3807
- - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
4091
+ - regex: '; {0,2}(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]{0,50})(\/[^ ]{0,50}) Build'
3808
4092
  device_replacement: 'Samsung $1$2$3'
3809
4093
  brand_replacement: 'Samsung'
3810
4094
  model_replacement: '$2'
3811
- - regex: '(?:; *|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
4095
+ - regex: '(?:; {0,2}|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
3812
4096
  device_replacement: 'Samsung $1'
3813
4097
  brand_replacement: 'Samsung'
3814
4098
  model_replacement: '$1'
3815
- - regex: '; (SAMSUNG-)([A-Za-z0-9\-]+).* Build/'
4099
+ - regex: '; (SAMSUNG-)([A-Za-z0-9\-]{0,50}).{0,200} Build/'
3816
4100
  device_replacement: 'Samsung $1$2'
3817
4101
  brand_replacement: 'Samsung'
3818
4102
  model_replacement: '$2'
3819
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4103
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3820
4104
  device_replacement: 'Samsung $1'
3821
4105
  brand_replacement: 'Samsung'
3822
4106
  model_replacement: '$1'
3823
- - regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
4107
+ - regex: '; {0,2}((?:SC)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|)\)'
3824
4108
  device_replacement: 'Samsung $1'
3825
4109
  brand_replacement: 'Samsung'
3826
4110
  model_replacement: '$1'
3827
- - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4111
+ - regex: ' ((?:SCH)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3828
4112
  device_replacement: 'Samsung $1'
3829
4113
  brand_replacement: 'Samsung'
3830
4114
  model_replacement: '$1'
3831
- - regex: '; *(Behold ?(?:2|II)|YP\-G[^;/]+|EK-GC100|SCL21|I9300) Build'
4115
+ - regex: '; {0,2}(Behold ?(?:2|II)|YP\-G[^;/]{1,100}|EK-GC100|SCL21|I9300) Build'
3832
4116
  device_replacement: 'Samsung $1'
3833
4117
  brand_replacement: 'Samsung'
3834
4118
  model_replacement: '$1'
3835
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
4119
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
3836
4120
  device_replacement: 'Samsung $1'
3837
4121
  brand_replacement: 'Samsung'
3838
4122
  model_replacement: '$1'
@@ -3842,11 +4126,11 @@ device_parsers:
3842
4126
  # @ref: http://www.sharp-phone.com/en/index.html
3843
4127
  # @ref: http://www.android.com/devices/?country=all&m=sharp
3844
4128
  #########
3845
- - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+) Build'
4129
+ - regex: '; {0,2}(SH\-?\d\d[^;/]{1,100}|SBM\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3846
4130
  device_replacement: '$1'
3847
4131
  brand_replacement: 'Sharp'
3848
4132
  model_replacement: '$1'
3849
- - regex: '; *(SHARP[ -])([^;/]+) Build'
4133
+ - regex: '; {0,2}(SHARP[ -])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3850
4134
  device_replacement: '$1$2'
3851
4135
  brand_replacement: 'Sharp'
3852
4136
  model_replacement: '$2'
@@ -3855,15 +4139,15 @@ device_parsers:
3855
4139
  # Simvalley
3856
4140
  # @ref: http://www.simvalley-mobile.de/
3857
4141
  #########
3858
- - regex: '; *(SPX[_\-]\d[^;/]*) Build/'
4142
+ - regex: '; {0,2}(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
3859
4143
  device_replacement: '$1'
3860
4144
  brand_replacement: 'Simvalley'
3861
4145
  model_replacement: '$1'
3862
- - regex: '; *(SX7\-PEARL\.GmbH) Build/'
4146
+ - regex: '; {0,2}(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
3863
4147
  device_replacement: '$1'
3864
4148
  brand_replacement: 'Simvalley'
3865
4149
  model_replacement: '$1'
3866
- - regex: '; *(SP[T]?\-\d{2}[^;/]*) Build/'
4150
+ - regex: '; {0,2}(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
3867
4151
  device_replacement: '$1'
3868
4152
  brand_replacement: 'Simvalley'
3869
4153
  model_replacement: '$1'
@@ -3873,7 +4157,7 @@ device_parsers:
3873
4157
  # @ref: http://www.sk-w.com/phone/phone_list.jsp
3874
4158
  # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
3875
4159
  #########
3876
- - regex: '; *(SK\-.*) Build/'
4160
+ - regex: '; {0,2}(SK\-.{0,200}?)(?: Build|\) AppleWebKit)'
3877
4161
  device_replacement: '$1'
3878
4162
  brand_replacement: 'SKtelesys'
3879
4163
  model_replacement: '$1'
@@ -3882,11 +4166,11 @@ device_parsers:
3882
4166
  # Skytex
3883
4167
  # @ref: http://skytex.com/android
3884
4168
  #########
3885
- - regex: '; *(?:SKYTEX|SX)-([^;/]+) Build'
4169
+ - regex: '; {0,2}(?:SKYTEX|SX)-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3886
4170
  device_replacement: '$1'
3887
4171
  brand_replacement: 'Skytex'
3888
4172
  model_replacement: '$1'
3889
- - regex: '; *(IMAGINE [^;/]+) Build'
4173
+ - regex: '; {0,2}(IMAGINE [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3890
4174
  device_replacement: '$1'
3891
4175
  brand_replacement: 'Skytex'
3892
4176
  model_replacement: '$1'
@@ -3896,7 +4180,7 @@ device_parsers:
3896
4180
  # @ref: http://en.smartdevices.com.cn/Products/
3897
4181
  # @models: Z8, X7, U7H, U7, T30, T20, Ten3, V5-II, T7-3G, SmartQ5, K7, S7, Q8, T19, Ten2, Ten, R10, T7, R7, V5, V7, SmartQ7
3898
4182
  #########
3899
- - regex: '; *(SmartQ) ?([^;/]+) Build/'
4183
+ - regex: '; {0,2}(SmartQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3900
4184
  device_replacement: '$1 $2'
3901
4185
  brand_replacement: '$1'
3902
4186
  model_replacement: '$2'
@@ -3906,7 +4190,7 @@ device_parsers:
3906
4190
  # @ref: http://www.smartbitt.com/
3907
4191
  # @missing: SBT Useragents
3908
4192
  #########
3909
- - regex: '; *(WF7C|WF10C|SBT[^;/]+) Build'
4193
+ - regex: '; {0,2}(WF7C|WF10C|SBT[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3910
4194
  device_replacement: '$1'
3911
4195
  brand_replacement: 'Smartbitt'
3912
4196
  model_replacement: '$1'
@@ -3915,15 +4199,15 @@ device_parsers:
3915
4199
  # Softbank (Operator Branded Devices)
3916
4200
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
3917
4201
  #########
3918
- - regex: '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4202
+ - regex: '; {0,2}(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
3919
4203
  device_replacement: '$1'
3920
4204
  brand_replacement: 'Sharp'
3921
4205
  model_replacement: '$1'
3922
- - regex: '; *(003P|101P|101P11C|102P) Build'
4206
+ - regex: '; {0,2}(003P|101P|101P11C|102P) Build'
3923
4207
  device_replacement: '$1'
3924
4208
  brand_replacement: 'Panasonic'
3925
4209
  model_replacement: '$1'
3926
- - regex: '; *(00\dZ) Build/'
4210
+ - regex: '; {0,2}(00\dZ) Build/'
3927
4211
  device_replacement: '$1'
3928
4212
  brand_replacement: 'ZTE'
3929
4213
  model_replacement: '$1'
@@ -3931,11 +4215,11 @@ device_parsers:
3931
4215
  device_replacement: '$1'
3932
4216
  brand_replacement: 'HTC'
3933
4217
  model_replacement: '$1'
3934
- - regex: '; *(001HT|X06HT) Build'
4218
+ - regex: '; {0,2}(001HT|X06HT) Build'
3935
4219
  device_replacement: '$1'
3936
4220
  brand_replacement: 'HTC'
3937
4221
  model_replacement: '$1'
3938
- - regex: '; *(201M) Build'
4222
+ - regex: '; {0,2}(201M) Build'
3939
4223
  device_replacement: '$1'
3940
4224
  brand_replacement: 'Motorola'
3941
4225
  model_replacement: 'XT902'
@@ -3945,11 +4229,11 @@ device_parsers:
3945
4229
  # @ref: http://www.trekstor.co.uk/surftabs-en.html
3946
4230
  # @note: Must come before SonyEricsson
3947
4231
  #########
3948
- - regex: '; *(ST\d{4}.*)Build/ST'
4232
+ - regex: '; {0,2}(ST\d{4}.{0,200})Build/ST'
3949
4233
  device_replacement: 'Trekstor $1'
3950
4234
  brand_replacement: 'Trekstor'
3951
4235
  model_replacement: '$1'
3952
- - regex: '; *(ST\d{4}.*) Build/'
4236
+ - regex: '; {0,2}(ST\d{4}.{0,200}?)(?: Build|\) AppleWebKit)'
3953
4237
  device_replacement: 'Trekstor $1'
3954
4238
  brand_replacement: 'Trekstor'
3955
4239
  model_replacement: '$1'
@@ -3961,16 +4245,16 @@ device_parsers:
3961
4245
  # @TODO: type!
3962
4246
  #########
3963
4247
  # android matchers
3964
- - regex: '; *(Sony ?Ericsson ?)([^;/]+) Build'
4248
+ - regex: '; {0,2}(Sony ?Ericsson ?)([^;/]{1,100}) Build'
3965
4249
  device_replacement: '$1$2'
3966
4250
  brand_replacement: 'SonyEricsson'
3967
4251
  model_replacement: '$2'
3968
- - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4252
+ - regex: '; {0,2}((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
3969
4253
  device_replacement: '$1'
3970
4254
  brand_replacement: 'SonyEricsson'
3971
4255
  model_replacement: '$1'
3972
4256
  # TODO X\d+ is wrong
3973
- - regex: '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]*) Build'
4257
+ - regex: '; {0,2}(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]{0,50}) Build'
3974
4258
  regex_flag: 'i'
3975
4259
  device_replacement: '$1'
3976
4260
  brand_replacement: 'SonyEricsson'
@@ -3982,31 +4266,31 @@ device_parsers:
3982
4266
  # @ref: http://www.sonymobile.com/global-en/products/phones/
3983
4267
  # @ref: http://www.sony.jp/tablet/
3984
4268
  #########
3985
- - regex: '; Sony (Tablet[^;/]+) Build'
4269
+ - regex: '; Sony (Tablet[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3986
4270
  device_replacement: 'Sony $1'
3987
4271
  brand_replacement: 'Sony'
3988
4272
  model_replacement: '$1'
3989
- - regex: '; Sony ([^;/]+) Build'
4273
+ - regex: '; Sony ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3990
4274
  device_replacement: 'Sony $1'
3991
4275
  brand_replacement: 'Sony'
3992
4276
  model_replacement: '$1'
3993
- - regex: '; *(Sony)([A-Za-z0-9\-]+) Build'
4277
+ - regex: '; {0,2}(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
3994
4278
  device_replacement: '$1 $2'
3995
4279
  brand_replacement: '$1'
3996
4280
  model_replacement: '$2'
3997
- - regex: '; *(Xperia [^;/]+) Build'
4281
+ - regex: '; {0,2}(Xperia [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3998
4282
  device_replacement: '$1'
3999
4283
  brand_replacement: 'Sony'
4000
4284
  model_replacement: '$1'
4001
- - regex: '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2}) Build'
4285
+ - regex: '; {0,2}(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2})(?: Build|\) AppleWebKit)'
4002
4286
  device_replacement: '$1'
4003
4287
  brand_replacement: 'Sony'
4004
4288
  model_replacement: '$1'
4005
- - regex: '; *(SGP\d{3}|SGPT\d{2}) Build'
4289
+ - regex: '; {0,2}(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4006
4290
  device_replacement: '$1'
4007
4291
  brand_replacement: 'Sony'
4008
4292
  model_replacement: '$1'
4009
- - regex: '; *(NW-Z1000Series) Build'
4293
+ - regex: '; {0,2}(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4010
4294
  device_replacement: '$1'
4011
4295
  brand_replacement: 'Sony'
4012
4296
  model_replacement: '$1'
@@ -4029,7 +4313,7 @@ device_parsers:
4029
4313
  # Spice
4030
4314
  # @ref: http://www.spicemobilephones.co.in/
4031
4315
  #########
4032
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*) Build/'
4316
+ - regex: '; {0,2}((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4033
4317
  device_replacement: '$1$2$3$4'
4034
4318
  brand_replacement: 'Spice'
4035
4319
  model_replacement: 'Mi$4'
@@ -4038,7 +4322,7 @@ device_parsers:
4038
4322
  # Sprint (Operator Branded Devices)
4039
4323
  # @ref:
4040
4324
  #########
4041
- - regex: '; *(Sprint )(.+?) *(?:Build|[;/])'
4325
+ - regex: '; {0,2}(Sprint )(.{1,200}?) {0,2}(?:Build|[;/])'
4042
4326
  device_replacement: '$1$2'
4043
4327
  brand_replacement: 'Sprint'
4044
4328
  model_replacement: '$2'
@@ -4051,7 +4335,7 @@ device_parsers:
4051
4335
  # Tagi
4052
4336
  # @ref: ??
4053
4337
  #########
4054
- - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+) Build/'
4338
+ - regex: '; {0,2}(TAGI[ ]?)(MID) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4055
4339
  device_replacement: '$1$2$3'
4056
4340
  brand_replacement: 'Tagi'
4057
4341
  model_replacement: '$2$3'
@@ -4060,7 +4344,7 @@ device_parsers:
4060
4344
  # Tecmobile
4061
4345
  # @ref: http://www.tecmobile.com/
4062
4346
  #########
4063
- - regex: '; *(Oyster500|Opal 800) Build'
4347
+ - regex: '; {0,2}(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4064
4348
  device_replacement: 'Tecmobile $1'
4065
4349
  brand_replacement: 'Tecmobile'
4066
4350
  model_replacement: '$1'
@@ -4069,7 +4353,7 @@ device_parsers:
4069
4353
  # Tecno
4070
4354
  # @ref: www.tecno-mobile.com/‎
4071
4355
  #########
4072
- - regex: '; *(TECNO[ _])([^;/]+) Build/'
4356
+ - regex: '; {0,2}(TECNO[ _])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4073
4357
  device_replacement: '$1$2'
4074
4358
  brand_replacement: 'Tecno'
4075
4359
  model_replacement: '$2'
@@ -4078,7 +4362,7 @@ device_parsers:
4078
4362
  # Telechips, Techvision evaluation boards
4079
4363
  # @ref:
4080
4364
  #########
4081
- - regex: '; *Android for (Telechips|Techvision) ([^ ]+) '
4365
+ - regex: '; {0,2}Android for (Telechips|Techvision) ([^ ]+) '
4082
4366
  regex_flag: 'i'
4083
4367
  device_replacement: '$1 $2'
4084
4368
  brand_replacement: '$1'
@@ -4089,7 +4373,7 @@ device_parsers:
4089
4373
  # @ref: http://www.telstra.com.au/home-phone/thub-2/
4090
4374
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
4091
4375
  #########
4092
- - regex: '; *(T-Hub2) Build/'
4376
+ - regex: '; {0,2}(T-Hub2)(?: Build|\) AppleWebKit)'
4093
4377
  device_replacement: '$1'
4094
4378
  brand_replacement: 'Telstra'
4095
4379
  model_replacement: '$1'
@@ -4098,7 +4382,7 @@ device_parsers:
4098
4382
  # Terra
4099
4383
  # @ref: http://www.wortmann.de/
4100
4384
  #########
4101
- - regex: '; *(PAD) ?(100[12]) Build/'
4385
+ - regex: '; {0,2}(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4102
4386
  device_replacement: 'Terra $1$2'
4103
4387
  brand_replacement: 'Terra'
4104
4388
  model_replacement: '$1$2'
@@ -4107,7 +4391,7 @@ device_parsers:
4107
4391
  # Texet
4108
4392
  # @ref: http://www.texet.ru/tablet/
4109
4393
  #########
4110
- - regex: '; *(T[BM]-\d{3}[^;/]+) Build/'
4394
+ - regex: '; {0,2}(T[BM]-\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4111
4395
  device_replacement: '$1'
4112
4396
  brand_replacement: 'Texet'
4113
4397
  model_replacement: '$1'
@@ -4116,11 +4400,11 @@ device_parsers:
4116
4400
  # Thalia
4117
4401
  # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
4118
4402
  #########
4119
- - regex: '; *(tolino [^;/]+) Build'
4403
+ - regex: '; {0,2}(tolino [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4120
4404
  device_replacement: '$1'
4121
4405
  brand_replacement: 'Thalia'
4122
4406
  model_replacement: '$1'
4123
- - regex: '; *Build/.* (TOLINO_BROWSER)'
4407
+ - regex: '; {0,2}Build/.{0,200} (TOLINO_BROWSER)'
4124
4408
  device_replacement: '$1'
4125
4409
  brand_replacement: 'Thalia'
4126
4410
  model_replacement: 'Tolino Shine'
@@ -4130,11 +4414,11 @@ device_parsers:
4130
4414
  # @ref: http://en.thl.com.cn/Mobile
4131
4415
  # @ref: http://thlmobilestore.com
4132
4416
  #########
4133
- - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+) Build/'
4417
+ - regex: '; {0,2}(?:CJ[ -])?(ThL|THL)[ -]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4134
4418
  device_replacement: '$1 $2'
4135
4419
  brand_replacement: 'Thl'
4136
4420
  model_replacement: '$2'
4137
- - regex: '; *(T100|T200|T5|W100|W200|W8s) Build/'
4421
+ - regex: '; {0,2}(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4138
4422
  device_replacement: '$1'
4139
4423
  brand_replacement: 'Thl'
4140
4424
  model_replacement: '$1'
@@ -4143,28 +4427,28 @@ device_parsers:
4143
4427
  # T-Mobile (Operator Branded Devices)
4144
4428
  #########
4145
4429
  # @ref: https://en.wikipedia.org/wiki/HTC_Hero
4146
- - regex: '; *(T-Mobile[ _]G2[ _]Touch) Build'
4430
+ - regex: '; {0,2}(T-Mobile[ _]G2[ _]Touch) Build'
4147
4431
  device_replacement: '$1'
4148
4432
  brand_replacement: 'HTC'
4149
4433
  model_replacement: 'Hero'
4150
4434
  # @ref: https://en.wikipedia.org/wiki/HTC_Desire_Z
4151
- - regex: '; *(T-Mobile[ _]G2) Build'
4435
+ - regex: '; {0,2}(T-Mobile[ _]G2) Build'
4152
4436
  device_replacement: '$1'
4153
4437
  brand_replacement: 'HTC'
4154
4438
  model_replacement: 'Desire Z'
4155
- - regex: '; *(T-Mobile myTouch Q) Build'
4439
+ - regex: '; {0,2}(T-Mobile myTouch Q) Build'
4156
4440
  device_replacement: '$1'
4157
4441
  brand_replacement: 'Huawei'
4158
4442
  model_replacement: 'U8730'
4159
- - regex: '; *(T-Mobile myTouch) Build'
4443
+ - regex: '; {0,2}(T-Mobile myTouch) Build'
4160
4444
  device_replacement: '$1'
4161
4445
  brand_replacement: 'Huawei'
4162
4446
  model_replacement: 'U8680'
4163
- - regex: '; *(T-Mobile_Espresso) Build'
4447
+ - regex: '; {0,2}(T-Mobile_Espresso) Build'
4164
4448
  device_replacement: '$1'
4165
4449
  brand_replacement: 'HTC'
4166
4450
  model_replacement: 'Espresso'
4167
- - regex: '; *(T-Mobile G1) Build'
4451
+ - regex: '; {0,2}(T-Mobile G1) Build'
4168
4452
  device_replacement: '$1'
4169
4453
  brand_replacement: 'HTC'
4170
4454
  model_replacement: 'Dream'
@@ -4172,11 +4456,11 @@ device_parsers:
4172
4456
  device_replacement: '$1$2 $3 $4'
4173
4457
  brand_replacement: 'HTC'
4174
4458
  model_replacement: '$2 $3 $4'
4175
- - regex: '\b(T-Mobile)_([^_]+)_(.*) Build'
4459
+ - regex: '\b(T-Mobile)_([^_]+)_(.{0,200}) Build'
4176
4460
  device_replacement: '$1 $2 $3'
4177
4461
  brand_replacement: 'Tmobile'
4178
4462
  model_replacement: '$2 $3'
4179
- - regex: '\b(T-Mobile)[_ ]?(.*?)Build'
4463
+ - regex: '\b(T-Mobile)[_ ]?(.{0,200}?)Build'
4180
4464
  device_replacement: '$1 $2'
4181
4465
  brand_replacement: 'Tmobile'
4182
4466
  model_replacement: '$2'
@@ -4185,7 +4469,7 @@ device_parsers:
4185
4469
  # Tomtec
4186
4470
  # @ref: http://www.tom-tec.eu/pages/tablets.php
4187
4471
  #########
4188
- - regex: ' (ATP[0-9]{4}) Build'
4472
+ - regex: ' (ATP[0-9]{4})(?: Build|\) AppleWebKit)'
4189
4473
  device_replacement: '$1'
4190
4474
  brand_replacement: 'Tomtec'
4191
4475
  model_replacement: '$1'
@@ -4194,7 +4478,7 @@ device_parsers:
4194
4478
  # Tooky
4195
4479
  # @ref: http://www.tookymobile.com/
4196
4480
  #########
4197
- - regex: ' *(TOOKY)[ _\-]([^;/]+) ?(?:Build|;)'
4481
+ - regex: ' ?(TOOKY)[ _\-]([^;/]{1,100}) ?(?:Build|;)'
4198
4482
  regex_flag: 'i'
4199
4483
  device_replacement: '$1 $2'
4200
4484
  brand_replacement: 'Tooky'
@@ -4209,11 +4493,11 @@ device_parsers:
4209
4493
  device_replacement: '$1'
4210
4494
  brand_replacement: 'Toshiba'
4211
4495
  model_replacement: 'Folio 100'
4212
- - regex: '; *([Ff]olio ?100) Build/'
4496
+ - regex: '; {0,2}([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4213
4497
  device_replacement: '$1'
4214
4498
  brand_replacement: 'Toshiba'
4215
4499
  model_replacement: 'Folio 100'
4216
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/'
4500
+ - regex: '; {0,2}(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]{1,100}|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4217
4501
  device_replacement: 'Toshiba $1'
4218
4502
  brand_replacement: 'Toshiba'
4219
4503
  model_replacement: '$1'
@@ -4222,12 +4506,12 @@ device_parsers:
4222
4506
  # Touchmate
4223
4507
  # @ref: http://touchmatepc.com/new/
4224
4508
  #########
4225
- - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750) Build'
4509
+ - regex: '; {0,2}(TM-MID\d+[^;/]{1,50}|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4226
4510
  device_replacement: '$1'
4227
4511
  brand_replacement: 'Touchmate'
4228
4512
  model_replacement: '$1'
4229
4513
  # @todo: needs verification user-agents missing
4230
- - regex: '; *(TM-SM\d+[^;/]+) Build'
4514
+ - regex: '; {0,2}(TM-SM\d+[^;/]{1,50}?)(?: Build|\) AppleWebKit)'
4231
4515
  device_replacement: '$1'
4232
4516
  brand_replacement: 'Touchmate'
4233
4517
  model_replacement: '$1'
@@ -4236,11 +4520,11 @@ device_parsers:
4236
4520
  # Treq
4237
4521
  # @ref: http://www.treq.co.id/product
4238
4522
  #########
4239
- - regex: '; *(A10 [Bb]asic2?) Build/'
4523
+ - regex: '; {0,2}(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4240
4524
  device_replacement: '$1'
4241
4525
  brand_replacement: 'Treq'
4242
4526
  model_replacement: '$1'
4243
- - regex: '; *(TREQ[ _\-])([^;/]+) Build'
4527
+ - regex: '; {0,2}(TREQ[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4244
4528
  regex_flag: 'i'
4245
4529
  device_replacement: '$1$2'
4246
4530
  brand_replacement: 'Treq'
@@ -4252,21 +4536,40 @@ device_parsers:
4252
4536
  # @models: A936|A603|X-5|X-3
4253
4537
  #########
4254
4538
  # @todo: guessed markers
4255
- - regex: '; *(X-?5|X-?3) Build/'
4539
+ - regex: '; {0,2}(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4256
4540
  device_replacement: '$1'
4257
4541
  brand_replacement: 'Umeox'
4258
4542
  model_replacement: '$1'
4259
4543
  # @todo: guessed markers
4260
- - regex: '; *(A502\+?|A936|A603|X1|X2) Build/'
4544
+ - regex: '; {0,2}(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4261
4545
  device_replacement: '$1'
4262
4546
  brand_replacement: 'Umeox'
4263
4547
  model_replacement: '$1'
4264
4548
 
4549
+ #########
4550
+ # Vernee
4551
+ # @ref: http://vernee.cc/
4552
+ # @models: Thor - Thor E
4553
+ #########
4554
+ - regex: '; thor Build/'
4555
+ device_replacement: 'Thor'
4556
+ brand_replacement: 'Vernee'
4557
+ model_replacement: 'Thor'
4558
+ # Regex to modidy for Thor Plus (don't find example UA)
4559
+ - regex: '; Thor (E)? Build/'
4560
+ device_replacement: 'Thor $1'
4561
+ brand_replacement: 'Vernee'
4562
+ model_replacement: 'Thor'
4563
+ - regex: '; Apollo Lite Build/'
4564
+ device_replacement: 'Apollo Lite'
4565
+ brand_replacement: 'Vernee'
4566
+ model_replacement: 'Apollo'
4567
+
4265
4568
  #########
4266
4569
  # Versus
4267
4570
  # @ref: http://versusuk.com/support.html
4268
4571
  #########
4269
- - regex: '(TOUCH(?:TAB|PAD).+?) Build/'
4572
+ - regex: '(TOUCH(?:TAB|PAD).{1,200}?)(?: Build|\) AppleWebKit)'
4270
4573
  regex_flag: 'i'
4271
4574
  device_replacement: 'Versus $1'
4272
4575
  brand_replacement: 'Versus'
@@ -4276,7 +4579,7 @@ device_parsers:
4276
4579
  # Vertu
4277
4580
  # @ref: http://www.vertu.com/
4278
4581
  #########
4279
- - regex: '(VERTU) ([^;/]+) Build/'
4582
+ - regex: '(VERTU) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4280
4583
  device_replacement: '$1 $2'
4281
4584
  brand_replacement: 'Vertu'
4282
4585
  model_replacement: '$2'
@@ -4285,11 +4588,11 @@ device_parsers:
4285
4588
  # Videocon
4286
4589
  # @ref: http://www.videoconmobiles.com
4287
4590
  #########
4288
- - regex: '; *(Videocon)[ _\-]([^;/]+) *(?:Build|;)'
4591
+ - regex: '; {0,2}(Videocon)[ _\-]([^;/]{1,100}?) {0,2}(?:Build|;)'
4289
4592
  device_replacement: '$1 $2'
4290
4593
  brand_replacement: 'Videocon'
4291
4594
  model_replacement: '$2'
4292
- - regex: ' (VT\d{2}[A-Za-z]*) Build'
4595
+ - regex: ' (VT\d{2}[A-Za-z]*)(?: Build|\) AppleWebKit)'
4293
4596
  device_replacement: '$1'
4294
4597
  brand_replacement: 'Videocon'
4295
4598
  model_replacement: '$1'
@@ -4298,15 +4601,15 @@ device_parsers:
4298
4601
  # Viewsonic
4299
4602
  # @ref: http://viewsonic.com
4300
4603
  #########
4301
- - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+) Build/'
4604
+ - regex: '; {0,2}((?:ViewPad|ViewPhone|VSD)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4302
4605
  device_replacement: '$1'
4303
4606
  brand_replacement: 'Viewsonic'
4304
4607
  model_replacement: '$1'
4305
- - regex: '; *(ViewSonic-)([^;/]+) Build/'
4608
+ - regex: '; {0,2}(ViewSonic-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4306
4609
  device_replacement: '$1$2'
4307
4610
  brand_replacement: 'Viewsonic'
4308
4611
  model_replacement: '$2'
4309
- - regex: '; *(GTablet.*) Build/'
4612
+ - regex: '; {0,2}(GTablet.{0,200}?)(?: Build|\) AppleWebKit)'
4310
4613
  device_replacement: '$1'
4311
4614
  brand_replacement: 'Viewsonic'
4312
4615
  model_replacement: '$1'
@@ -4315,7 +4618,7 @@ device_parsers:
4315
4618
  # vivo
4316
4619
  # @ref: http://vivo.cn/
4317
4620
  #########
4318
- - regex: '; *([Vv]ivo)[ _]([^;/]+) Build'
4621
+ - regex: '; {0,2}([Vv]ivo)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4319
4622
  device_replacement: '$1 $2'
4320
4623
  brand_replacement: 'vivo'
4321
4624
  model_replacement: '$2'
@@ -4324,7 +4627,7 @@ device_parsers:
4324
4627
  # Vodafone (Operator Branded Devices)
4325
4628
  # @ref: ??
4326
4629
  #########
4327
- - regex: '(Vodafone) (.*) Build/'
4630
+ - regex: '(Vodafone) (.{0,200}?)(?: Build|\) AppleWebKit)'
4328
4631
  device_replacement: '$1 $2'
4329
4632
  brand_replacement: '$1'
4330
4633
  model_replacement: '$2'
@@ -4333,7 +4636,7 @@ device_parsers:
4333
4636
  # Walton
4334
4637
  # @ref: http://www.waltonbd.com/
4335
4638
  #########
4336
- - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+) Build'
4639
+ - regex: '; {0,2}(?:Walton[ _\-]|)(Primo[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4337
4640
  regex_flag: 'i'
4338
4641
  device_replacement: 'Walton $1'
4339
4642
  brand_replacement: 'Walton'
@@ -4343,7 +4646,7 @@ device_parsers:
4343
4646
  # Wiko
4344
4647
  # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
4345
4648
  #########
4346
- - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/'
4649
+ - regex: '; {0,2}(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4347
4650
  regex_flag: 'i'
4348
4651
  device_replacement: 'Wiko $1'
4349
4652
  brand_replacement: 'Wiko'
@@ -4353,7 +4656,7 @@ device_parsers:
4353
4656
  # WellcoM
4354
4657
  # @ref: ??
4355
4658
  #########
4356
- - regex: '; *WellcoM-([^;/]+) Build'
4659
+ - regex: '; {0,2}WellcoM-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4357
4660
  device_replacement: 'Wellcom $1'
4358
4661
  brand_replacement: 'Wellcom'
4359
4662
  model_replacement: '$1'
@@ -4371,7 +4674,7 @@ device_parsers:
4371
4674
  # Wolfgang
4372
4675
  # @ref: http://wolfgangmobile.com/
4373
4676
  #########
4374
- - regex: '; *(AT-AS[^;/]+) Build'
4677
+ - regex: '; {0,2}(AT-AS[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4375
4678
  device_replacement: 'Wolfgang $1'
4376
4679
  brand_replacement: 'Wolfgang'
4377
4680
  model_replacement: '$1'
@@ -4380,7 +4683,7 @@ device_parsers:
4380
4683
  # Woxter
4381
4684
  # @ref: http://www.woxter.es/es-es/categories/index
4382
4685
  #########
4383
- - regex: '; *(?:Woxter|Wxt) ([^;/]+) Build'
4686
+ - regex: '; {0,2}(?:Woxter|Wxt) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4384
4687
  device_replacement: 'Woxter $1'
4385
4688
  brand_replacement: 'Woxter'
4386
4689
  model_replacement: '$1'
@@ -4389,7 +4692,7 @@ device_parsers:
4389
4692
  # Yarvik Zania
4390
4693
  # @ref: http://yarvik.com
4391
4694
  #########
4392
- - regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3}) Build/'
4695
+ - regex: '; {0,2}(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3})(?: Build|\) AppleWebKit)'
4393
4696
  device_replacement: 'Yarvik $1'
4394
4697
  brand_replacement: 'Yarvik'
4395
4698
  model_replacement: '$1'
@@ -4403,7 +4706,7 @@ device_parsers:
4403
4706
  # M778, M7000, M7000AD, M7000NBD, M7001, M7002, M7002KBD, M777, M767,
4404
4707
  # M789, M799, M769, M757, M755, M753, M752, M739, M729, M723, M712, M727
4405
4708
  #########
4406
- - regex: '; *([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4709
+ - regex: '; {0,2}([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4407
4710
  device_replacement: 'Yifang $1$2$3'
4408
4711
  brand_replacement: 'Yifang'
4409
4712
  model_replacement: '$2'
@@ -4412,19 +4715,19 @@ device_parsers:
4412
4715
  # XiaoMi
4413
4716
  # @ref: http://www.xiaomi.com/event/buyphone
4414
4717
  #########
4415
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4718
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4416
4719
  device_replacement: 'XiaoMi $1'
4417
4720
  brand_replacement: 'XiaoMi'
4418
4721
  model_replacement: '$1'
4419
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4722
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4420
4723
  device_replacement: 'XiaoMi $1'
4421
4724
  brand_replacement: 'XiaoMi'
4422
4725
  model_replacement: '$1'
4423
- - regex: '; *(MIX) (Build|MIUI)/'
4726
+ - regex: '; {0,2}(MIX) (Build|MIUI)/'
4424
4727
  device_replacement: 'XiaoMi $1'
4425
4728
  brand_replacement: 'XiaoMi'
4426
4729
  model_replacement: '$1'
4427
- - regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
4730
+ - regex: '; {0,2}((MIX) ([^;/]*)) (Build|MIUI)/'
4428
4731
  device_replacement: 'XiaoMi $1'
4429
4732
  brand_replacement: 'XiaoMi'
4430
4733
  model_replacement: '$1'
@@ -4433,17 +4736,17 @@ device_parsers:
4433
4736
  # Xolo
4434
4737
  # @ref: http://www.xolo.in/
4435
4738
  #########
4436
- - regex: '; *XOLO[ _]([^;/]*tab.*) Build'
4739
+ - regex: '; {0,2}XOLO[ _]([^;/]{0,30}tab.{0,30})(?: Build|\) AppleWebKit)'
4437
4740
  regex_flag: 'i'
4438
4741
  device_replacement: 'Xolo $1'
4439
4742
  brand_replacement: 'Xolo'
4440
4743
  model_replacement: '$1'
4441
- - regex: '; *XOLO[ _]([^;/]+) Build'
4744
+ - regex: '; {0,2}XOLO[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4442
4745
  regex_flag: 'i'
4443
4746
  device_replacement: 'Xolo $1'
4444
4747
  brand_replacement: 'Xolo'
4445
4748
  model_replacement: '$1'
4446
- - regex: '; *(q\d0{2,3}[a-z]?) Build'
4749
+ - regex: '; {0,2}(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4447
4750
  regex_flag: 'i'
4448
4751
  device_replacement: 'Xolo $1'
4449
4752
  brand_replacement: 'Xolo'
@@ -4453,7 +4756,7 @@ device_parsers:
4453
4756
  # Xoro
4454
4757
  # @ref: http://www.xoro.de/produkte/
4455
4758
  #########
4456
- - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/]) Build'
4759
+ - regex: '; {0,2}(PAD ?[79]\d+[^;/]{0,50}|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4457
4760
  device_replacement: 'Xoro $1'
4458
4761
  brand_replacement: 'Xoro'
4459
4762
  model_replacement: '$1'
@@ -4462,7 +4765,7 @@ device_parsers:
4462
4765
  # Zopo
4463
4766
  # @ref: http://www.zopomobiles.com/products.html
4464
4767
  #########
4465
- - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379])) Build'
4768
+ - regex: '; {0,2}(?:(?:ZOPO|Zopo)[ _]([^;/]{1,100}?)|(ZP ?(?:\d{2}[^;/]{1,100}|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4466
4769
  device_replacement: '$1$2$3'
4467
4770
  brand_replacement: 'Zopo'
4468
4771
  model_replacement: '$1$2$3'
@@ -4471,11 +4774,11 @@ device_parsers:
4471
4774
  # ZiiLabs
4472
4775
  # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
4473
4776
  #########
4474
- - regex: '; *(ZiiLABS) (Zii[^;/]*) Build'
4777
+ - regex: '; {0,2}(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4475
4778
  device_replacement: '$1 $2'
4476
4779
  brand_replacement: 'ZiiLabs'
4477
4780
  model_replacement: '$2'
4478
- - regex: '; *(Zii)_([^;/]*) Build'
4781
+ - regex: '; {0,2}(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4479
4782
  device_replacement: '$1 $2'
4480
4783
  brand_replacement: 'ZiiLabs'
4481
4784
  model_replacement: '$2'
@@ -4484,45 +4787,45 @@ device_parsers:
4484
4787
  # ZTE
4485
4788
  # @ref: http://www.ztedevices.com/
4486
4789
  #########
4487
- - regex: '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*|Era|Memo[^;]*)|JOE|(?:Kis|KIS)\b[^;]*|Libra|Light [^;]*|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*|RacerII|RACERII|San Francisco[^;]*|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?) Build'
4790
+ - regex: '; {0,2}(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]{0,200}?|Era|Memo[^;]{0,200}?)|JOE|(?:Kis|KIS)\b[^;]{0,200}?|Libra|Light [^;]{0,200}?|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]{0,200}?|RacerII|RACERII|San Francisco[^;]{0,200}?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\) AppleWebKit)'
4488
4791
  device_replacement: '$1'
4489
4792
  brand_replacement: 'ZTE'
4490
4793
  model_replacement: '$1'
4491
- - regex: '; *([A-Z]\d+)_USA_[^;]* Build'
4794
+ - regex: '; {0,2}([A-Z]\d+)_USA_[^;]{0,200}(?: Build|\) AppleWebKit)'
4492
4795
  device_replacement: '$1'
4493
4796
  brand_replacement: 'ZTE'
4494
4797
  model_replacement: '$1'
4495
- - regex: '; *(SmartTab\d+)[^;]* Build'
4798
+ - regex: '; {0,2}(SmartTab\d+)[^;]{0,50}(?: Build|\) AppleWebKit)'
4496
4799
  device_replacement: '$1'
4497
4800
  brand_replacement: 'ZTE'
4498
4801
  model_replacement: '$1'
4499
- - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*) Build'
4802
+ - regex: '; {0,2}(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4500
4803
  device_replacement: 'ZTE Blade$1'
4501
4804
  brand_replacement: 'ZTE'
4502
4805
  model_replacement: 'Blade$1'
4503
- - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*) Build'
4806
+ - regex: '; {0,2}(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4504
4807
  device_replacement: 'ZTE Skate$1'
4505
4808
  brand_replacement: 'ZTE'
4506
4809
  model_replacement: 'Skate$1'
4507
- - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco) Build'
4810
+ - regex: '; {0,2}(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4508
4811
  device_replacement: '$1$2'
4509
4812
  brand_replacement: 'ZTE'
4510
4813
  model_replacement: '$1$2'
4511
- - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+) Build'
4814
+ - regex: '; {0,2}(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4512
4815
  device_replacement: 'ZTE $1'
4513
4816
  brand_replacement: 'ZTE'
4514
4817
  model_replacement: '$1'
4515
4818
  # operator specific
4516
- - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*) Build'
4819
+ - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]{0,200}?)(?: Build|\) AppleWebKit)'
4517
4820
  device_replacement: '$1 $2'
4518
4821
  brand_replacement: 'ZTE'
4519
4822
  model_replacement: '$1 $2'
4520
- - regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link) Build'
4823
+ - regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link)(?: Build|\) AppleWebKit)'
4521
4824
  regex_flag: 'i'
4522
4825
  device_replacement: '$1'
4523
4826
  brand_replacement: 'ZTE'
4524
4827
  model_replacement: '$1'
4525
- - regex: '; *(vp9plus)\)'
4828
+ - regex: '; {0,2}(vp9plus)\)'
4526
4829
  device_replacement: '$1'
4527
4830
  brand_replacement: 'ZTE'
4528
4831
  model_replacement: '$1'
@@ -4531,7 +4834,7 @@ device_parsers:
4531
4834
  # Zync
4532
4835
  # @ref: http://www.zync.in/index.php/our-products/tablet-phablets
4533
4836
  ##########
4534
- - regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900) Build/'
4837
+ - regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900)(?: Build|\) AppleWebKit)'
4535
4838
  device_replacement: '$1'
4536
4839
  brand_replacement: 'Zync'
4537
4840
  model_replacement: '$1'
@@ -4582,7 +4885,7 @@ device_parsers:
4582
4885
  device_replacement: 'Kindle Fire HDX 8.9" 4G'
4583
4886
  brand_replacement: 'Amazon'
4584
4887
  model_replacement: 'Kindle Fire HDX 8.9" 4G'
4585
- - regex: '; ?Amazon ([^;/]+) Build\b'
4888
+ - regex: '; ?Amazon ([^;/]{1,100}) Build\b'
4586
4889
  device_replacement: '$1'
4587
4890
  brand_replacement: 'Amazon'
4588
4891
  model_replacement: '$1'
@@ -4605,22 +4908,22 @@ device_parsers:
4605
4908
 
4606
4909
  #########
4607
4910
  # Devices from chinese manufacturer(s)
4608
- # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.*
4911
+ # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.{0,200}
4609
4912
  #########
4610
- - regex: '(sprd)\-([^/]+)/'
4913
+ - regex: '(sprd)\-([^/]{1,50})/'
4611
4914
  device_replacement: '$1 $2'
4612
4915
  brand_replacement: '$1'
4613
4916
  model_replacement: '$2'
4614
4917
  # @ref: http://eshinechina.en.alibaba.com/
4615
- - regex: '; *(H\d{2}00\+?) Build'
4918
+ - regex: '; {0,2}(H\d{2}00\+?) Build'
4616
4919
  device_replacement: '$1'
4617
4920
  brand_replacement: 'Hero'
4618
4921
  model_replacement: '$1'
4619
- - regex: '; *(iphone|iPhone5) Build/'
4922
+ - regex: '; {0,2}(iphone|iPhone5) Build/'
4620
4923
  device_replacement: 'Xianghe $1'
4621
4924
  brand_replacement: 'Xianghe'
4622
4925
  model_replacement: '$1'
4623
- - regex: '; *(e\d{4}[a-z]?_?v\d+|v89_[^;/]+)[^;/]+ Build/'
4926
+ - regex: '; {0,2}(e\d{4}[a-z]?_?v\d+|v89_[^;/]{1,100})[^;/]{1,30} Build/'
4624
4927
  device_replacement: 'Xianghe $1'
4625
4928
  brand_replacement: 'Xianghe'
4626
4929
  model_replacement: '$1'
@@ -4642,7 +4945,7 @@ device_parsers:
4642
4945
  #########
4643
4946
  # Alcatel Windows Phones
4644
4947
  #########
4645
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
4948
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]{0,200}; {0,2}([^;,\)]+)'
4646
4949
  device_replacement: 'Alcatel $1'
4647
4950
  brand_replacement: 'Alcatel'
4648
4951
  model_replacement: '$1'
@@ -4650,8 +4953,7 @@ device_parsers:
4650
4953
  #########
4651
4954
  # Asus Windows Phones
4652
4955
  #########
4653
- #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4654
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4956
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]{0,200}; {0,2}([^;,\)]+)'
4655
4957
  device_replacement: 'Asus $1'
4656
4958
  brand_replacement: 'Asus'
4657
4959
  model_replacement: '$1'
@@ -4659,7 +4961,7 @@ device_parsers:
4659
4961
  #########
4660
4962
  # Dell Windows Phones
4661
4963
  #########
4662
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
4964
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]{0,200}; {0,2}([^;,\)]+)'
4663
4965
  device_replacement: 'Dell $1'
4664
4966
  brand_replacement: 'Dell'
4665
4967
  model_replacement: '$1'
@@ -4667,7 +4969,7 @@ device_parsers:
4667
4969
  #########
4668
4970
  # HTC Windows Phones
4669
4971
  #########
4670
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)'
4972
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]{0,200})[^;]{0,200}; {0,2}(?:HTC|)([^;,\)]+)'
4671
4973
  device_replacement: 'HTC $1'
4672
4974
  brand_replacement: 'HTC'
4673
4975
  model_replacement: '$1'
@@ -4675,7 +4977,7 @@ device_parsers:
4675
4977
  #########
4676
4978
  # Huawei Windows Phones
4677
4979
  #########
4678
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
4980
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]{0,200}; {0,2}(?:HUAWEI |)([^;,\)]+)'
4679
4981
  device_replacement: 'Huawei $1'
4680
4982
  brand_replacement: 'Huawei'
4681
4983
  model_replacement: '$1'
@@ -4683,7 +4985,7 @@ device_parsers:
4683
4985
  #########
4684
4986
  # LG Windows Phones
4685
4987
  #########
4686
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
4988
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]{0,200}; {0,2}(?:LG[ \-]|)([^;,\)]+)'
4687
4989
  device_replacement: 'LG $1'
4688
4990
  brand_replacement: 'LG'
4689
4991
  model_replacement: '$1'
@@ -4691,15 +4993,15 @@ device_parsers:
4691
4993
  #########
4692
4994
  # Noka Windows Phones
4693
4995
  #########
4694
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
4996
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
4695
4997
  device_replacement: 'Lumia $1'
4696
4998
  brand_replacement: 'Nokia'
4697
4999
  model_replacement: 'Lumia $1'
4698
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
5000
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(RM-\d{3,})'
4699
5001
  device_replacement: 'Nokia $1'
4700
5002
  brand_replacement: 'Nokia'
4701
5003
  model_replacement: '$1'
4702
- - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
5004
+ - regex: '(?:Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
4703
5005
  device_replacement: 'Nokia $1'
4704
5006
  brand_replacement: 'Nokia'
4705
5007
  model_replacement: '$1'
@@ -4707,7 +5009,7 @@ device_parsers:
4707
5009
  #########
4708
5010
  # Microsoft Windows Phones
4709
5011
  #########
4710
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
5012
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]{0,200}; {0,2}([^;,\)]+)'
4711
5013
  device_replacement: 'Microsoft $1'
4712
5014
  brand_replacement: 'Microsoft'
4713
5015
  model_replacement: '$1'
@@ -4715,7 +5017,7 @@ device_parsers:
4715
5017
  #########
4716
5018
  # Samsung Windows Phones
4717
5019
  #########
4718
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
5020
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]{0,200}; {0,2}(?:SAMSUNG |)([^;,\.\)]+)'
4719
5021
  device_replacement: 'Samsung $1'
4720
5022
  brand_replacement: 'Samsung'
4721
5023
  model_replacement: '$1'
@@ -4723,7 +5025,7 @@ device_parsers:
4723
5025
  #########
4724
5026
  # Toshiba Windows Phones
4725
5027
  #########
4726
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
5028
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]{0,200}; {0,2}([^;,\)]+)'
4727
5029
  device_replacement: 'Toshiba $1'
4728
5030
  brand_replacement: 'Toshiba'
4729
5031
  model_replacement: '$1'
@@ -4731,7 +5033,7 @@ device_parsers:
4731
5033
  #########
4732
5034
  # Generic Windows Phones
4733
5035
  #########
4734
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
5036
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]{1,200}); {0,2}([^;,\)]+)'
4735
5037
  device_replacement: '$1 $2'
4736
5038
  brand_replacement: '$1'
4737
5039
  model_replacement: '$2'
@@ -4743,7 +5045,7 @@ device_parsers:
4743
5045
  #########
4744
5046
  # Samsung Bada Phones
4745
5047
  #########
4746
- - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]+).* Bada/'
5048
+ - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]{1,50}).{0,200} Bada/'
4747
5049
  device_replacement: 'Samsung $1'
4748
5050
  brand_replacement: 'Samsung'
4749
5051
  model_replacement: '$1'
@@ -4751,24 +5053,40 @@ device_parsers:
4751
5053
  #########
4752
5054
  # Firefox OS
4753
5055
  #########
4754
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5056
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]{1,100}?)(?:/[^;]{1,200}|); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4755
5057
  device_replacement: 'Alcatel $1 $2 $3'
4756
5058
  brand_replacement: 'Alcatel'
4757
5059
  model_replacement: 'One Touch $3'
4758
- - regex: '\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5060
+ - regex: '\(Mobile; (?:ZTE([^;]{1,200})|(OpenC)); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4759
5061
  device_replacement: 'ZTE $1$2'
4760
5062
  brand_replacement: 'ZTE'
4761
5063
  model_replacement: '$1$2'
4762
5064
 
5065
+ #########
5066
+ # KaiOS
5067
+ #########
5068
+ - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/[^\/]{1,200} KaiOS/'
5069
+ device_replacement: 'Alcatel $1'
5070
+ brand_replacement: 'Alcatel'
5071
+ model_replacement: '$1'
5072
+ - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]{1,100})\/.{0,100};.{0,100}rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
5073
+ device_replacement: 'LYF $1'
5074
+ brand_replacement: 'LYF'
5075
+ model_replacement: '$1'
5076
+ - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]{1,100})_.{1,100}; rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
5077
+ device_replacement: 'Nokia $1'
5078
+ brand_replacement: 'Nokia'
5079
+ model_replacement: '$1'
5080
+
4763
5081
  ##########
4764
5082
  # NOKIA
4765
5083
  # @note: NokiaN8-00 comes before iphone. Sometimes spoofs iphone
4766
5084
  ##########
4767
- - regex: 'Nokia(N[0-9]+)([A-z_\-][A-z0-9_\-]*)'
5085
+ - regex: 'Nokia(N[0-9]+)([A-Za-z_\-][A-Za-z0-9_\-]*)'
4768
5086
  device_replacement: 'Nokia $1'
4769
5087
  brand_replacement: 'Nokia'
4770
5088
  model_replacement: '$1$2'
4771
- - regex: '(?:NOKIA|Nokia)(?:\-| *)(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
5089
+ - regex: '(?:NOKIA|Nokia)(?:\-| {0,2})(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
4772
5090
  device_replacement: 'Nokia $1$2$3'
4773
5091
  brand_replacement: 'Nokia'
4774
5092
  model_replacement: '$1$2$3'
@@ -4777,12 +5095,12 @@ device_parsers:
4777
5095
  brand_replacement: 'Nokia'
4778
5096
  model_replacement: 'Lumia $1'
4779
5097
  # UCWEB Browser on Symbian
4780
- - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+)\)'
5098
+ - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]{1,100}?)\)'
4781
5099
  device_replacement: '$1 $2'
4782
5100
  brand_replacement: '$1'
4783
5101
  model_replacement: '$2'
4784
5102
  # Nokia Symbian
4785
- - regex: '\(Symbian(?:/3|); U; ([^;]+);'
5103
+ - regex: '\(Symbian(?:/3|); U; ([^;]{1,200});'
4786
5104
  device_replacement: 'Nokia $1'
4787
5105
  brand_replacement: 'Nokia'
4788
5106
  model_replacement: '$1'
@@ -4795,7 +5113,7 @@ device_parsers:
4795
5113
  device_replacement: 'BlackBerry $1'
4796
5114
  brand_replacement: 'BlackBerry'
4797
5115
  model_replacement: '$1'
4798
- - regex: 'Play[Bb]ook.+RIM Tablet OS'
5116
+ - regex: 'Play[Bb]ook.{1,200}RIM Tablet OS'
4799
5117
  device_replacement: 'BlackBerry Playbook'
4800
5118
  brand_replacement: 'BlackBerry'
4801
5119
  model_replacement: 'Playbook'
@@ -4827,7 +5145,7 @@ device_parsers:
4827
5145
  device_replacement: 'Palm Treo $1'
4828
5146
  brand_replacement: 'Palm'
4829
5147
  model_replacement: 'Treo $1'
4830
- - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
5148
+ - regex: 'webOS.{0,200}(P160U(?:NA|))/(\d+).(\d+)'
4831
5149
  device_replacement: 'HP Veer'
4832
5150
  brand_replacement: 'HP'
4833
5151
  model_replacement: 'Veer'
@@ -4835,7 +5153,7 @@ device_parsers:
4835
5153
  device_replacement: 'HP TouchPad'
4836
5154
  brand_replacement: 'HP'
4837
5155
  model_replacement: 'TouchPad'
4838
- - regex: 'HPiPAQ([A-Za-z0-9]+)/\d+.\d+'
5156
+ - regex: 'HPiPAQ([A-Za-z0-9]{1,20})/\d+\.\d+'
4839
5157
  device_replacement: 'HP iPAQ $1'
4840
5158
  brand_replacement: 'HP'
4841
5159
  model_replacement: 'iPAQ $1'
@@ -4889,7 +5207,7 @@ device_parsers:
4889
5207
  - regex: '(Watch)(\d+,\d+)'
4890
5208
  device_replacement: 'Apple $1'
4891
5209
  brand_replacement: 'Apple'
4892
- model_replacement: 'Apple $1 $2'
5210
+ model_replacement: '$1$2'
4893
5211
  - regex: '(Apple Watch)(?:;| Simulator;)'
4894
5212
  device_replacement: '$1'
4895
5213
  brand_replacement: 'Apple'
@@ -4903,18 +5221,18 @@ device_parsers:
4903
5221
  brand_replacement: 'Apple'
4904
5222
  model_replacement: 'iPhone'
4905
5223
  # @note: desktop applications show device info
4906
- - regex: 'CFNetwork/.* Darwin/\d.*\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
5224
+ - regex: 'CFNetwork/.{0,100} Darwin/\d.{0,100}\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
4907
5225
  device_replacement: '$1$2,$3'
4908
5226
  brand_replacement: 'Apple'
4909
5227
  model_replacement: '$1$2,$3'
4910
5228
  # @note: newer desktop applications don't show device info
4911
5229
  # This is here so as to not have them recorded as iOS-Device
4912
- - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5230
+ - regex: 'CFNetwork/.{0,100} Darwin/\d+\.\d+\.\d+ \(x86_64\)'
4913
5231
  device_replacement: 'Mac'
4914
5232
  brand_replacement: 'Apple'
4915
5233
  model_replacement: 'Mac'
4916
5234
  # @note: iOS applications do not show device info
4917
- - regex: 'CFNetwork/.* Darwin/\d'
5235
+ - regex: 'CFNetwork/.{0,100} Darwin/\d'
4918
5236
  device_replacement: 'iOS-Device'
4919
5237
  brand_replacement: 'Apple'
4920
5238
  model_replacement: 'iOS-Device'
@@ -4958,7 +5276,7 @@ device_parsers:
4958
5276
  device_replacement: 'Asus $1'
4959
5277
  brand_replacement: 'Asus'
4960
5278
  model_replacement: '$1'
4961
- - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5279
+ - regex: '(?:asus.{0,200}?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
4962
5280
  device_replacement: 'Asus $1'
4963
5281
  brand_replacement: 'Asus'
4964
5282
  model_replacement: '$1'
@@ -4991,11 +5309,11 @@ device_parsers:
4991
5309
  device_replacement: 'DoCoMo $1'
4992
5310
  brand_replacement: 'DoCoMo'
4993
5311
  model_replacement: '$1'
4994
- - regex: '([A-Za-z0-9]+)_W;FOMA'
5312
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30})_W;FOMA'
4995
5313
  device_replacement: 'DoCoMo $1'
4996
5314
  brand_replacement: 'DoCoMo'
4997
5315
  model_replacement: '$1'
4998
- - regex: '([A-Za-z0-9]+);FOMA'
5316
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30});FOMA'
4999
5317
  device_replacement: 'DoCoMo $1'
5000
5318
  brand_replacement: 'DoCoMo'
5001
5319
  model_replacement: '$1'
@@ -5003,7 +5321,7 @@ device_parsers:
5003
5321
  ##########
5004
5322
  # htc
5005
5323
  ##########
5006
- - regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5324
+ - regex: '\b(?:HTC/|HTC/[a-z0-9]{1,20}/|)HTC[ _\-;]? {0,2}(.{0,200}?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5007
5325
  device_replacement: 'HTC $1'
5008
5326
  brand_replacement: 'HTC'
5009
5327
  model_replacement: '$1'
@@ -5060,22 +5378,22 @@ device_parsers:
5060
5378
  # HbbTV (European and Australian standard)
5061
5379
  # written before the LG regexes, as LG is making HbbTV too
5062
5380
  ##########
5063
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]*; *(LG)E *; *([^;]*) *;[^;]*;[^;]*;\)'
5381
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \( ?;(LG)E ?;([^;]{0,30})'
5064
5382
  device_replacement: '$1'
5065
5383
  brand_replacement: '$2'
5066
5384
  model_replacement: '$3'
5067
- - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
5385
+ - regex: '(HbbTV)/1\.1\.1.{0,200}CE-HTML/1\.\d;(Vendor/|)(THOM[^;]{0,200}?)[;\s].{0,30}(LF[^;]{1,200});?'
5068
5386
  device_replacement: '$1'
5069
5387
  brand_replacement: 'Thomson'
5070
5388
  model_replacement: '$4'
5071
- - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);'
5389
+ - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); {0,2}CE-HTML(?:/1\.\d|); {0,2}([^ ]{1,30}) ([^;]{1,200});'
5072
5390
  device_replacement: '$1'
5073
5391
  brand_replacement: '$2'
5074
5392
  model_replacement: '$3'
5075
5393
  - regex: '(HbbTV)/1\.1\.1 \(;;;;;\) Maple_2011'
5076
5394
  device_replacement: '$1'
5077
5395
  brand_replacement: 'Samsung'
5078
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]*; *(?:CUS:([^;]*)|([^;]+)) *; *([^;]*) *;.*;'
5396
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]{0,200})|([^;]{1,200})) ?; ?([^;]{0,30})'
5079
5397
  device_replacement: '$1'
5080
5398
  brand_replacement: '$2$3'
5081
5399
  model_replacement: '$4'
@@ -5085,7 +5403,7 @@ device_parsers:
5085
5403
  ##########
5086
5404
  # LGE NetCast TV
5087
5405
  ##########
5088
- - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5406
+ - regex: 'LGE; (?:Media\/|)([^;]{0,200});[^;]{0,200};[^;]{0,200};?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5089
5407
  device_replacement: 'NetCast$2'
5090
5408
  brand_replacement: 'LG'
5091
5409
  model_replacement: '$1'
@@ -5093,11 +5411,11 @@ device_parsers:
5093
5411
  ##########
5094
5412
  # InettvBrowser
5095
5413
  ##########
5096
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;(Sony)([^;]*);[^;]*;[^\)]*\)'
5414
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};(Sony)([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5097
5415
  device_replacement: 'Inettv'
5098
5416
  brand_replacement: '$1'
5099
5417
  model_replacement: '$2'
5100
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;([^;]*);[^;]*;[^\)]*\)'
5418
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5101
5419
  device_replacement: 'Inettv'
5102
5420
  brand_replacement: 'Generic_Inettv'
5103
5421
  model_replacement: '$1'
@@ -5134,7 +5452,7 @@ device_parsers:
5134
5452
  device_replacement: 'Microsoft $1'
5135
5453
  brand_replacement: 'Microsoft'
5136
5454
  model_replacement: '$1'
5137
- - regex: '(?:MSIE|XBMC).*\b(Xbox)\b'
5455
+ - regex: '(?:MSIE|XBMC).{0,200}\b(Xbox)\b'
5138
5456
  device_replacement: '$1'
5139
5457
  brand_replacement: 'Microsoft'
5140
5458
  model_replacement: '$1'
@@ -5195,12 +5513,12 @@ device_parsers:
5195
5513
  # Samsung
5196
5514
  ##########
5197
5515
  # Samsung Smart-TV
5198
- - regex: '(SMART-TV); .* Tizen '
5516
+ - regex: '(SMART-TV); .{0,200} Tizen '
5199
5517
  device_replacement: 'Samsung $1'
5200
5518
  brand_replacement: 'Samsung'
5201
5519
  model_replacement: '$1'
5202
5520
  # Samsung Symbian Devices
5203
- - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
5521
+ - regex: 'SymbianOS/9\.\d.{0,200} Samsung[/\-]([A-Za-z0-9 \-]+)'
5204
5522
  device_replacement: 'Samsung $1'
5205
5523
  brand_replacement: 'Samsung'
5206
5524
  model_replacement: '$1'
@@ -5208,7 +5526,7 @@ device_parsers:
5208
5526
  device_replacement: '$1 $2$3'
5209
5527
  brand_replacement: '$1'
5210
5528
  model_replacement: '$2-$3'
5211
- - regex: 'SAMSUNG-ANDROID-MMS/([^;/]+)'
5529
+ - regex: 'SAMSUNG-ANDROID-MMS/([^;/]{1,100})'
5212
5530
  device_replacement: '$1'
5213
5531
  brand_replacement: 'Samsung'
5214
5532
  model_replacement: '$1'
@@ -5255,7 +5573,7 @@ device_parsers:
5255
5573
  ##########
5256
5574
  # Sony
5257
5575
  ##########
5258
- - regex: 'Android [^;]+; ([^ ]+) (Sony)/'
5576
+ - regex: 'Android [^;]{1,200}; ([^ ]+) (Sony)/'
5259
5577
  device_replacement: '$2 $1'
5260
5578
  brand_replacement: '$2'
5261
5579
  model_replacement: '$1'
@@ -5289,27 +5607,33 @@ device_parsers:
5289
5607
  #########
5290
5608
  # Android General Device Matching (far from perfect)
5291
5609
  #########
5292
- - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))'
5610
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.{1,200})( Build[/ ]|\))'
5293
5611
  brand_replacement: 'Generic_Android'
5294
5612
  model_replacement: '$1'
5295
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))'
5613
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5296
5614
  brand_replacement: 'Generic_Android'
5297
5615
  model_replacement: '$1'
5298
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))'
5616
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5299
5617
  brand_replacement: 'Generic_Android'
5300
5618
  model_replacement: '$1'
5301
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))'
5619
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{0,2}\- {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5302
5620
  brand_replacement: 'Generic_Android'
5303
5621
  model_replacement: '$1'
5304
5622
  # No build info at all - "Build" follows locale immediately
5305
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5623
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5306
5624
  device_replacement: 'Generic Smartphone'
5307
5625
  brand_replacement: 'Generic'
5308
5626
  model_replacement: 'Smartphone'
5309
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
5627
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,3}\-?[A-Za-z]{2}; {0,2}(.{1,50}?)( Build[/ ]|\))'
5310
5628
  brand_replacement: 'Generic_Android'
5311
5629
  model_replacement: '$1'
5312
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|)(?:;.*|); *(.+?)( Build[/ ]|\))'
5630
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Mobile Safari'
5631
+ brand_replacement: 'Generic_Android'
5632
+ model_replacement: '$1'
5633
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Safari'
5634
+ brand_replacement: 'Generic_Android_Tablet'
5635
+ model_replacement: '$1'
5636
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\))'
5313
5637
  brand_replacement: 'Generic_Android'
5314
5638
  model_replacement: '$1'
5315
5639
 
@@ -5334,7 +5658,7 @@ device_parsers:
5334
5658
  ##########
5335
5659
  # Generic Tablet
5336
5660
  ##########
5337
- - regex: '(Android 3\.\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))'
5661
+ - regex: '(Android 3\.\d|Opera Tablet|Tablet; .{1,100}Firefox/|Android.{0,100}(?:Tab|Pad))'
5338
5662
  regex_flag: 'i'
5339
5663
  device_replacement: 'Generic Tablet'
5340
5664
  brand_replacement: 'Generic'
@@ -5343,7 +5667,7 @@ device_parsers:
5343
5667
  ##########
5344
5668
  # Generic Smart Phone
5345
5669
  ##########
5346
- - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .+Firefox/|iPhone OS|Android|MobileSafari|Windows *Phone|\(webOS/|PalmOS)'
5670
+ - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .{1,200}Firefox/|iPhone OS|Android|MobileSafari|Windows {0,2}Phone|\(webOS/|PalmOS)'
5347
5671
  device_replacement: 'Generic Smartphone'
5348
5672
  brand_replacement: 'Generic'
5349
5673
  model_replacement: 'Smartphone'
@@ -5354,9 +5678,9 @@ device_parsers:
5354
5678
  model_replacement: 'Smartphone'
5355
5679
 
5356
5680
  ##########
5357
- # Spiders (this is hack...)
5681
+ # Spiders (this is a hack...)
5358
5682
  ##########
5359
- - regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti)'
5683
+ - regex: '^.{0,100}(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.{0,200}/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)'
5360
5684
  regex_flag: 'i'
5361
5685
  device_replacement: 'Spider'
5362
5686
  brand_replacement: 'Spider'
@@ -5395,3 +5719,14 @@ device_parsers:
5395
5719
  device_replacement: 'Generic Feature Phone'
5396
5720
  brand_replacement: 'Generic'
5397
5721
  model_replacement: 'Feature Phone'
5722
+
5723
+ #########
5724
+ # Apple
5725
+ # @ref: https://www.apple.com/mac/
5726
+ # @note: lookup Mac OS, but exclude iPad, Apple TV, a HTC phone, Kindle, LG
5727
+ # @note: put this at the end, since it is hard to implement contains foo, but not contain bar1, bar 2, bar 3 in go's re2
5728
+ #########
5729
+ - regex: 'Mac OS'
5730
+ device_replacement: 'Mac'
5731
+ brand_replacement: 'Apple'
5732
+ model_replacement: 'Mac'