user_agent_parser 2.7.0 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/vendor/uap-core/regexes.yaml +779 -634
  3. metadata +7 -7
@@ -41,7 +41,7 @@ user_agent_parsers:
41
41
 
42
42
  - regex: 'ArcGIS\.?(iOS|Android|NET|Qt)(?:-|\.)(\d+)\.(\d+)(?:\.(\d+)|)'
43
43
  family_replacement: 'ArcGIS Runtime SDK for $1'
44
-
44
+
45
45
  - regex: 'ArcGIS\.Runtime\.(Qt)\.(\d+)\.(\d+)(?:\.(\d+)|)'
46
46
  family_replacement: 'ArcGIS Runtime SDK for $1'
47
47
 
@@ -52,9 +52,9 @@ user_agent_parsers:
52
52
  family_replacement: 'AntennaPod'
53
53
  - regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
54
54
  - regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
55
- - regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
56
- - regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
57
- - 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'
58
58
 
59
59
  # Podcast catchers
60
60
  - regex: '^(Luminary)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
@@ -95,7 +95,7 @@ user_agent_parsers:
95
95
  family_replacement: 'Tableau'
96
96
 
97
97
  # Adobe CreativeCloud
98
- - regex: 'AppleWebKit/\d+\.\d+.* Safari.* (CreativeCloud)/(\d+)\.(\d+).(\d+)'
98
+ - regex: 'AppleWebKit/\d{1,10}\.\d{1,10}.{0,200} Safari.{0,200} (CreativeCloud)/(\d+)\.(\d+).(\d+)'
99
99
  family_replacement: 'Adobe CreativeCloud'
100
100
 
101
101
  # Salesforce
@@ -110,7 +110,7 @@ user_agent_parsers:
110
110
  family_replacement: 'FacebookBot'
111
111
 
112
112
  # Google Plus
113
- - regex: 'Google.*/\+/web/snippet'
113
+ - regex: 'Google.{0,50}/\+/web/snippet'
114
114
  family_replacement: 'GooglePlusBot'
115
115
 
116
116
  # Gmail
@@ -128,10 +128,10 @@ user_agent_parsers:
128
128
  # Bots Pattern 'name/0.0.0'
129
129
  - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
130
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|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
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+)|)'
132
132
 
133
133
  # MSIECrawler
134
- - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
134
+ - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.{0,200} MSIECrawler'
135
135
  family_replacement: 'MSIECrawler'
136
136
 
137
137
  # DAVdroid
@@ -145,7 +145,7 @@ user_agent_parsers:
145
145
  family_replacement: 'Pinterestbot'
146
146
 
147
147
  # Bots
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|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+)|)|)|)'
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+)|)|)|)'
149
149
 
150
150
  # AWS S3 Clients
151
151
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
@@ -166,21 +166,22 @@ user_agent_parsers:
166
166
  # Facebook
167
167
  # Must come before "Bots General matcher" to catch OrangeBotswana
168
168
  # Facebook Messenger must go before Facebook
169
- - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
169
+ - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
170
+
170
171
  family_replacement: 'Facebook Messenger'
171
172
  # Facebook
172
- - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
+ - regex: '\[FB.{0,300};(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
174
  family_replacement: 'Facebook'
174
175
  # Sometimes Facebook does not specify a version (FBAV)
175
- - regex: '\[FB.*;'
176
+ - regex: '\[FB.{0,300};'
176
177
  family_replacement: 'Facebook'
177
178
 
178
179
  # Bots General matcher 'name/0.0'
179
- - 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+)|)|)'
180
181
  # Bots containing bot(but not CUBOT)
181
- - 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+)|)|)'
182
183
  # Bots containing spider|scrape|Crawl
183
- - 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+)|)|)'
184
185
 
185
186
  # HbbTV standard defines what features the browser should understand.
186
187
  # but it's like targeting "HTML5 browsers", effective browser support depends on the model
@@ -196,16 +197,16 @@ user_agent_parsers:
196
197
 
197
198
  # Social Networks (non-Facebook)
198
199
  # Pinterest
199
- - regex: '\[(Pinterest)/[^\]]+\]'
200
+ - regex: '\[(Pinterest)/[^\]]{1,50}\]'
200
201
  - regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
201
202
  # Instagram app
202
- - regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
203
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Instagram).(\d+)\.(\d+)\.(\d+)'
203
204
  # Flipboard app
204
- - regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
206
  # Flipboard-briefing app
206
- - regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
208
  # Onefootball app
208
- - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
210
  # Snapchat
210
211
  - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
211
212
  # Twitter
@@ -213,15 +214,11 @@ user_agent_parsers:
213
214
  family_replacement: 'Twitter'
214
215
 
215
216
  # aspiegel.com spider (owned by Huawei)
216
- - regex: 'Mozilla.*Mobile.*AspiegelBot'
217
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
217
218
  family_replacement: 'Spider'
218
- brand_replacement: 'Spider'
219
- model_replacement: 'Smartphone'
220
219
 
221
220
  - regex: 'AspiegelBot'
222
221
  family_replacement: 'Spider'
223
- brand_replacement: 'Spider'
224
- model_replacement: 'Desktop'
225
222
 
226
223
  # Basilisk
227
224
  - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
@@ -238,7 +235,7 @@ user_agent_parsers:
238
235
  family_replacement: 'Firefox Mobile'
239
236
  - regex: '(Fennec)/(\d+)\.(\d+)'
240
237
  family_replacement: 'Firefox Mobile'
241
- - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
238
+ - regex: '(?:Mobile|Tablet);.{0,200}(Firefox)/(\d+)\.(\d+)'
242
239
  family_replacement: 'Firefox Mobile'
243
240
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
244
241
  family_replacement: 'Firefox ($1)'
@@ -252,7 +249,7 @@ user_agent_parsers:
252
249
  family_replacement: 'Firefox Beta'
253
250
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
254
251
  family_replacement: 'Firefox ($1)'
255
- - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
252
+ - regex: '(Firefox).{0,200}Tablet browser (\d+)\.(\d+)\.(\d+)'
256
253
  family_replacement: 'MicroB'
257
254
  - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
258
255
  - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
@@ -284,24 +281,24 @@ user_agent_parsers:
284
281
 
285
282
  # Opera will stop at 9.80 and hide the real version in the Version string.
286
283
  # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
287
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
284
+ - regex: '(Opera Tablet).{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
288
285
  - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
289
- - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
286
+ - regex: '(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\d+)\.(\d+)'
290
287
  family_replacement: 'Opera Mobile'
291
- - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
288
+ - regex: '(Opera)/(\d+)\.(\d+).{1,100}Opera Mobi'
292
289
  family_replacement: 'Opera Mobile'
293
- - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
290
+ - regex: 'Opera Mobi.{1,100}(Opera)(?:/|\s+)(\d+)\.(\d+)'
294
291
  family_replacement: 'Opera Mobile'
295
292
  - regex: 'Opera Mobi'
296
293
  family_replacement: 'Opera Mobile'
297
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
294
+ - regex: '(Opera)/9.80.{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
298
295
 
299
296
  # Opera 14 for Android uses a WebKit render engine.
300
- - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
297
+ - regex: '(?:Mobile Safari).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
301
298
  family_replacement: 'Opera Mobile'
302
299
 
303
300
  # Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
304
- - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
301
+ - regex: '(?:Chrome).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
305
302
  family_replacement: 'Opera'
306
303
 
307
304
  # Opera Coast
@@ -313,7 +310,7 @@ user_agent_parsers:
313
310
  family_replacement: 'Opera Mini'
314
311
 
315
312
  # Opera Neon
316
- - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
313
+ - regex: 'Chrome/.{1,200}( MMS)/(\d+).(\d+).(\d+)'
317
314
  family_replacement: 'Opera Neon'
318
315
 
319
316
  # Palm WebOS looks a lot like Safari.
@@ -360,7 +357,7 @@ user_agent_parsers:
360
357
 
361
358
  - regex: '(Symphony) (\d+).(\d+)'
362
359
 
363
- - regex: 'PLAYSTATION 3.+WebKit'
360
+ - regex: 'PLAYSTATION 3.{1,200}WebKit'
364
361
  family_replacement: 'NetFront NX'
365
362
  - regex: 'PLAYSTATION 3'
366
363
  family_replacement: 'NetFront'
@@ -369,7 +366,7 @@ user_agent_parsers:
369
366
  - regex: '(PlayStation Vita)'
370
367
  family_replacement: 'NetFront NX'
371
368
 
372
- - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
369
+ - regex: 'AppleWebKit.{1,200} (NX)/(\d+)\.(\d+)\.(\d+)'
373
370
  family_replacement: 'NetFront NX'
374
371
  - regex: '(Nintendo 3DS)'
375
372
  family_replacement: 'NetFront NX'
@@ -382,7 +379,7 @@ user_agent_parsers:
382
379
  - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
383
380
 
384
381
  # Edge Mobile
385
- - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
382
+ - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
386
383
  family_replacement: 'Edge Mobile'
387
384
  - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
388
385
  family_replacement: 'Edge Mobile'
@@ -430,7 +427,7 @@ user_agent_parsers:
430
427
  family_replacement: 'TopBuzz'
431
428
 
432
429
  # Google Search App on Android, eg:
433
- - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
430
+ - regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
434
431
  family_replacement: 'Google'
435
432
 
436
433
  # QQ Browsers
@@ -441,10 +438,18 @@ user_agent_parsers:
441
438
  - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
442
439
  family_replacement: 'QQ Browser'
443
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
+
444
449
  # Chrome Mobile
445
- - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
450
+ - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
446
451
  family_replacement: 'Chrome Mobile WebView'
447
- - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
452
+ - regex: '; wv\).{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
448
453
  family_replacement: 'Chrome Mobile WebView'
449
454
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
450
455
  family_replacement: 'Chrome Mobile'
@@ -452,7 +457,7 @@ user_agent_parsers:
452
457
  family_replacement: 'Chrome Mobile iOS'
453
458
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
454
459
  family_replacement: 'Chrome Mobile'
455
- - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
460
+ - regex: ' Mobile .{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
456
461
  family_replacement: 'Chrome Mobile'
457
462
 
458
463
  # Chrome Frame must come before MSIE.
@@ -482,7 +487,7 @@ user_agent_parsers:
482
487
  family_replacement: 'Yandex Browser'
483
488
 
484
489
  # Mail.ru Amigo/Internet Browser (Chromium-based)
485
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
490
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME'
486
491
  family_replacement: 'Mail.ru Chromium Browser'
487
492
 
488
493
  # AOL Browser (IE-based)
@@ -509,6 +514,9 @@ user_agent_parsers:
509
514
  # @ref: http://www.ghost.org
510
515
  - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
511
516
 
517
+ # Palo Alto GlobalProtect Linux
518
+ - regex: 'PAN (GlobalProtect)/(\d+)\.(\d+)\.(\d+) .{1,100} \(X11; Linux x86_64\)'
519
+
512
520
  #### END SPECIAL CASES TOP ####
513
521
 
514
522
  #### MAIN CASES - this catches > 50% of all browsers ####
@@ -550,7 +558,7 @@ user_agent_parsers:
550
558
  - regex: 'Microsoft Office (Word) 2014'
551
559
 
552
560
  # Windows Live Mail
553
- - regex: 'Outlook-Express\/7\.0.*'
561
+ - regex: 'Outlook-Express\/7\.0'
554
562
  family_replacement: 'Windows Live Mail'
555
563
 
556
564
  # Apple Air Mail
@@ -590,7 +598,7 @@ user_agent_parsers:
590
598
  family_replacement: 'Brave'
591
599
 
592
600
  # Iron Browser ~since version 50
593
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
601
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]'
594
602
  family_replacement: 'Iron'
595
603
 
596
604
  # Dolphin Browser
@@ -666,13 +674,13 @@ user_agent_parsers:
666
674
  - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
667
675
  - regex: '^(Stitcher)/iOS'
668
676
  - regex: '^(Stitcher)/Android'
669
- - regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
677
+ - regex: '^(VLC) .{0,200}version (\d+)\.(\d+)\.(\d+)'
670
678
  - regex: ' (VLC) for'
671
679
  - regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
672
680
  family_replacement: 'VLC'
673
- - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
674
- - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
675
- - 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+|)'
676
684
  family_replacement: 'Amarok'
677
685
  - regex: '(Custom)-Feed Reader'
678
686
 
@@ -706,7 +714,7 @@ user_agent_parsers:
706
714
 
707
715
  # desktop mode
708
716
  # http://www.anandtech.com/show/3982/windows-phone-7-review
709
- - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
717
+ - regex: '(MSIE) (\d+)\.(\d+).{0,100}XBLWP7'
710
718
  family_replacement: 'IE Large Screen'
711
719
 
712
720
  # Nextcloud desktop sync client
@@ -723,6 +731,17 @@ user_agent_parsers:
723
731
  - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
724
732
  family_replacement: 'Skype'
725
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
+
726
745
  #### END MAIN CASES ####
727
746
 
728
747
  #### SPECIAL CASES ####
@@ -759,15 +778,15 @@ user_agent_parsers:
759
778
  family_replacement: 'TopBuzz'
760
779
 
761
780
  # @note: iOS / OSX Applications
762
- - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
781
+ - regex: '(iPod|iPhone|iPad).{1,200}GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
763
782
  family_replacement: 'Google'
764
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
783
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|).{1,200}[ +]Safari'
765
784
  family_replacement: 'Mobile Safari'
766
- - 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+|)'
767
786
  family_replacement: 'Mobile Safari UI/WKWebView'
768
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
787
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
769
788
  family_replacement: 'Mobile Safari UI/WKWebView'
770
- - regex: '(iPod|iPod touch|iPhone|iPad).* Safari'
789
+ - regex: '(iPod|iPod touch|iPhone|iPad).{0,200} Safari'
771
790
  family_replacement: 'Mobile Safari'
772
791
  - regex: '(iPod|iPod touch|iPhone|iPad)'
773
792
  family_replacement: 'Mobile Safari UI/WKWebView'
@@ -818,9 +837,9 @@ user_agent_parsers:
818
837
  - regex: '(Nokia)[EN]?(\d+)'
819
838
 
820
839
  # BlackBerry devices
821
- - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
840
+ - regex: '(PlayBook).{1,200}RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
822
841
  family_replacement: 'BlackBerry WebKit'
823
- - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
842
+ - regex: '(Black[bB]erry|BB10).{1,200}Version/(\d+)\.(\d+)\.(\d+)'
824
843
  family_replacement: 'BlackBerry WebKit'
825
844
  - regex: '(Black[bB]erry)\s?(\d+)'
826
845
  family_replacement: 'BlackBerry'
@@ -840,18 +859,15 @@ user_agent_parsers:
840
859
 
841
860
  - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
842
861
 
843
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
844
- # family_replacement: 'iPad'
845
-
846
862
  # Phantomjs, should go before Safari
847
863
  - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
848
864
 
849
865
  # WebKit Nightly
850
- - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
866
+ - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .{0,200} Safari'
851
867
  family_replacement: 'WebKit Nightly'
852
868
 
853
869
  # Safari
854
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
870
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).{0,100}Safari/'
855
871
  family_replacement: 'Safari'
856
872
  # Safari didn't provide "Version/d.d.d" prior to 3.0
857
873
  - regex: '(Safari)/\d+'
@@ -900,6 +916,7 @@ user_agent_parsers:
900
916
  - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
901
917
  - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
902
918
 
919
+
903
920
  - regex: '([MS]?IE) (\d+)\.(\d+)'
904
921
  family_replacement: 'IE'
905
922
 
@@ -907,7 +924,30 @@ user_agent_parsers:
907
924
  family_replacement: 'Python Requests'
908
925
 
909
926
  # headless user-agents
910
- - 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)(?:[ /](\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})\)'
938
+
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)'
911
951
 
912
952
  # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
913
953
  - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
@@ -915,9 +955,25 @@ user_agent_parsers:
915
955
 
916
956
  - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
917
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'
973
+
918
974
  # Cloud Storage Clients
919
975
  - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
920
- - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
976
+ - regex: '^(S3 Browser) (\d+)[.-](\d+)[.-](\d+)(?:\s*https?://s3browser\.com|)'
921
977
  - regex: '(S3Gof3r)'
922
978
  # IBM COS (Cloud Object Storage) API
923
979
  - regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
@@ -940,6 +996,15 @@ user_agent_parsers:
940
996
  - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
941
997
  family_replacement: 'ViaFree'
942
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
+
943
1008
  os_parsers:
944
1009
  ##########
945
1010
  # HbbTV vendors
@@ -955,7 +1020,7 @@ os_parsers:
955
1020
  # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
956
1021
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
957
1022
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
958
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
1023
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.{0,200};.{0,200}; ([0-9]{4});\)'
959
1024
 
960
1025
 
961
1026
  # LG is consistent too, but we need to add manually the year model
@@ -975,9 +1040,9 @@ os_parsers:
975
1040
  os_replacement: 'Samsung'
976
1041
  os_v1_replacement: '2011'
977
1042
  # manage the two models of 2013
978
- - 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'
979
1044
  os_v2_replacement: 'UE40F7000'
980
- - 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'
981
1046
  os_v2_replacement: 'UE32F4500'
982
1047
  # generic Samsung (works starting in 2012)
983
1048
  #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
@@ -985,26 +1050,26 @@ os_parsers:
985
1050
  # Philips : not found any other way than a manual mapping
986
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
987
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
988
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
1053
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/4'
989
1054
  os_v1_replacement: '2013'
990
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
1055
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/3'
991
1056
  os_v1_replacement: '2012'
992
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
1057
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/2'
993
1058
  os_v1_replacement: '2011'
994
1059
 
995
1060
  # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
996
- - 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+)'
997
1062
  os_replacement: 'FireHbbTV'
998
1063
 
999
1064
  # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
1000
- - 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}\)'
1001
1066
 
1002
1067
  # aspiegel.com spider (owned by Huawei)
1003
1068
  - regex: 'AspiegelBot'
1004
1069
  os_replacement: 'Other'
1005
1070
 
1006
1071
  ##########
1007
- # @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:
1008
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)...
1009
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)...
1010
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)...
@@ -1013,12 +1078,12 @@ os_parsers:
1013
1078
 
1014
1079
  - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
1015
1080
 
1016
- # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
1017
- - 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'
1018
1083
  os_replacement: 'iOS'
1019
1084
 
1020
1085
  # Special case for old ArcGIS Mobile products
1021
- - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]+|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1086
+ - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]{1,50}|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1022
1087
 
1023
1088
  # Special case for new ArcGIS Mobile products
1024
1089
  - regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
@@ -1052,14 +1117,14 @@ os_parsers:
1052
1117
  - regex: '(Android) (\d+);'
1053
1118
 
1054
1119
  # UCWEB
1055
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
1120
+ - regex: '^UCWEB.{0,200}; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]{1,100})|);'
1056
1121
  os_replacement: 'Android'
1057
- - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1122
+ - regex: '^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1058
1123
  os_replacement: 'iOS'
1059
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1124
+ - regex: '^UCWEB.{0,200}; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1060
1125
  os_replacement: 'Windows Phone'
1061
1126
  # JUC
1062
- - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
1127
+ - regex: '^(JUC).{0,200}; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]{1,100})|)'
1063
1128
  os_replacement: 'Android'
1064
1129
 
1065
1130
  # Salesforce
@@ -1077,7 +1142,7 @@ os_parsers:
1077
1142
  # properly identify as Chrome OS
1078
1143
  #
1079
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
1080
- - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
1145
+ - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$'
1081
1146
  os_replacement: 'Chrome OS'
1082
1147
 
1083
1148
  ##########
@@ -1169,7 +1234,7 @@ os_parsers:
1169
1234
  os_v1_replacement: '95'
1170
1235
 
1171
1236
  # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads
1172
- - regex: '^Box.*Windows/([\d.]+);'
1237
+ - regex: '^Box.{0,200}Windows/([\d.]+);'
1173
1238
  os_replacement: 'Windows'
1174
1239
  os_v1_replacement: '$1'
1175
1240
 
@@ -1186,33 +1251,33 @@ os_parsers:
1186
1251
  ##########
1187
1252
  - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
1188
1253
  os_replacement: 'Mac OS X'
1189
- - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
1254
+ - regex: 'Mac OS X\s.{1,50}\s(\d+).(\d+).(\d+)'
1190
1255
  os_replacement: 'Mac OS X'
1191
1256
  os_v1_replacement: '$1'
1192
1257
  os_v2_replacement: '$2'
1193
1258
  os_v3_replacement: '$3'
1194
1259
  # Leopard
1195
- - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
1260
+ - regex: ' (Dar)(win)/(9).(\d+).{0,100}\((?:i386|x86_64|Power Macintosh)\)'
1196
1261
  os_replacement: 'Mac OS X'
1197
1262
  os_v1_replacement: '10'
1198
1263
  os_v2_replacement: '5'
1199
1264
  # Snow Leopard
1200
- - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
1265
+ - regex: ' (Dar)(win)/(10).(\d+).{0,100}\((?:i386|x86_64)\)'
1201
1266
  os_replacement: 'Mac OS X'
1202
1267
  os_v1_replacement: '10'
1203
1268
  os_v2_replacement: '6'
1204
1269
  # Lion
1205
- - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
1270
+ - regex: ' (Dar)(win)/(11).(\d+).{0,100}\((?:i386|x86_64)\)'
1206
1271
  os_replacement: 'Mac OS X'
1207
1272
  os_v1_replacement: '10'
1208
1273
  os_v2_replacement: '7'
1209
1274
  # Mountain Lion
1210
- - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
1275
+ - regex: ' (Dar)(win)/(12).(\d+).{0,100}\((?:i386|x86_64)\)'
1211
1276
  os_replacement: 'Mac OS X'
1212
1277
  os_v1_replacement: '10'
1213
1278
  os_v2_replacement: '8'
1214
1279
  # Mavericks
1215
- - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
1280
+ - regex: ' (Dar)(win)/(13).(\d+).{0,100}\((?:i386|x86_64)\)'
1216
1281
  os_replacement: 'Mac OS X'
1217
1282
  os_v1_replacement: '10'
1218
1283
  os_v2_replacement: '9'
@@ -1229,7 +1294,7 @@ os_parsers:
1229
1294
  - regex: '(?:PPC|Intel) (Mac OS X)'
1230
1295
 
1231
1296
  # Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
1232
- - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1297
+ - regex: '^Box.{0,200};(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1233
1298
  os_replacement: 'Mac OS X'
1234
1299
 
1235
1300
  ##########
@@ -1240,7 +1305,7 @@ os_parsers:
1240
1305
  - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
1241
1306
  os_replacement: 'ATV OS X'
1242
1307
 
1243
- - 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+)|)'
1244
1309
  os_replacement: 'iOS'
1245
1310
 
1246
1311
  # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
@@ -1248,15 +1313,15 @@ os_parsers:
1248
1313
  os_replacement: 'iOS'
1249
1314
 
1250
1315
  # few more stragglers
1251
- - 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+)'
1252
1317
  os_replacement: 'iOS'
1253
1318
 
1254
1319
  # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
1255
1320
  # whether the os maps to Mac OS, or iOS, or just Darwin.
1256
1321
  # See: http://user-agents.me/cfnetwork-version-list
1257
- - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
1322
+ - regex: '(CFNetwork)/(5)48\.0\.3.{0,100} Darwin/11\.0\.0'
1258
1323
  os_replacement: 'iOS'
1259
- - 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'
1260
1325
  os_replacement: 'iOS'
1261
1326
  - regex: '(CFNetwork)/(5)48\.(1)\.4'
1262
1327
  os_replacement: 'iOS'
@@ -1291,17 +1356,17 @@ os_parsers:
1291
1356
  os_replacement: 'Mac OS X'
1292
1357
  os_v1_replacement: '10'
1293
1358
  os_v2_replacement: '11'
1294
- - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+'
1359
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.4\.\d+'
1295
1360
  os_replacement: 'iOS'
1296
1361
  os_v1_replacement: '9'
1297
1362
  os_v2_replacement: '3'
1298
1363
  os_v3_replacement: '1'
1299
- - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+'
1364
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.5\.\d+'
1300
1365
  os_replacement: 'iOS'
1301
1366
  os_v1_replacement: '9'
1302
1367
  os_v2_replacement: '3'
1303
1368
  os_v3_replacement: '2'
1304
- - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+'
1369
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.6\.\d+'
1305
1370
  os_replacement: 'iOS'
1306
1371
  os_v1_replacement: '9'
1307
1372
  os_v2_replacement: '3'
@@ -1322,15 +1387,15 @@ os_parsers:
1322
1387
  # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
1323
1388
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1324
1389
  ##########
1325
- - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)'
1390
+ - regex: 'CFNetwork/.{0,100} Darwin/17\.\d+.{0,100}\(x86_64\)'
1326
1391
  os_replacement: 'Mac OS X'
1327
1392
  os_v1_replacement: '10'
1328
1393
  os_v2_replacement: '13'
1329
- - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
1394
+ - regex: 'CFNetwork/.{0,100} Darwin/16\.\d+.{0,100}\(x86_64\)'
1330
1395
  os_replacement: 'Mac OS X'
1331
1396
  os_v1_replacement: '10'
1332
1397
  os_v2_replacement: '12'
1333
- - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
1398
+ - regex: 'CFNetwork/8.{0,100} Darwin/15\.\d+.{0,100}\(x86_64\)'
1334
1399
  os_replacement: 'Mac OS X'
1335
1400
  os_v1_replacement: '10'
1336
1401
  os_v2_replacement: '11'
@@ -1338,87 +1403,146 @@ os_parsers:
1338
1403
  # CFNetwork iOS Apps
1339
1404
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1340
1405
  ##########
1341
- - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
1406
+ - regex: 'CFNetwork/.{0,100} Darwin/(9)\.\d+'
1342
1407
  os_replacement: 'iOS'
1343
1408
  os_v1_replacement: '1'
1344
- - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
1409
+ - regex: 'CFNetwork/.{0,100} Darwin/(10)\.\d+'
1345
1410
  os_replacement: 'iOS'
1346
1411
  os_v1_replacement: '4'
1347
- - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
1412
+ - regex: 'CFNetwork/.{0,100} Darwin/(11)\.\d+'
1348
1413
  os_replacement: 'iOS'
1349
1414
  os_v1_replacement: '5'
1350
- - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
1415
+ - regex: 'CFNetwork/.{0,100} Darwin/(13)\.\d+'
1351
1416
  os_replacement: 'iOS'
1352
1417
  os_v1_replacement: '6'
1353
- - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
1418
+ - regex: 'CFNetwork/6.{0,100} Darwin/(14)\.\d+'
1354
1419
  os_replacement: 'iOS'
1355
1420
  os_v1_replacement: '7'
1356
- - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
1421
+ - regex: 'CFNetwork/7.{0,100} Darwin/(14)\.\d+'
1357
1422
  os_replacement: 'iOS'
1358
1423
  os_v1_replacement: '8'
1359
1424
  os_v2_replacement: '0'
1360
- - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
1425
+ - regex: 'CFNetwork/7.{0,100} Darwin/(15)\.\d+'
1361
1426
  os_replacement: 'iOS'
1362
1427
  os_v1_replacement: '9'
1363
1428
  os_v2_replacement: '0'
1364
- - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+'
1429
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.5\.\d+'
1365
1430
  os_replacement: 'iOS'
1366
1431
  os_v1_replacement: '10'
1367
1432
  os_v2_replacement: '3'
1368
- - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+'
1433
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.6\.\d+'
1369
1434
  os_replacement: 'iOS'
1370
1435
  os_v1_replacement: '10'
1371
1436
  os_v2_replacement: '3'
1372
1437
  os_v3_replacement: '2'
1373
- - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+'
1438
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.7\.\d+'
1374
1439
  os_replacement: 'iOS'
1375
1440
  os_v1_replacement: '10'
1376
1441
  os_v2_replacement: '3'
1377
1442
  os_v3_replacement: '3'
1378
- - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
1443
+ - regex: 'CFNetwork/8.{0,100} Darwin/(16)\.\d+'
1379
1444
  os_replacement: 'iOS'
1380
1445
  os_v1_replacement: '10'
1381
- - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+'
1446
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.0\.\d+'
1382
1447
  os_replacement: 'iOS'
1383
1448
  os_v1_replacement: '11'
1384
1449
  os_v2_replacement: '0'
1385
- - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+'
1450
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.2\.\d+'
1386
1451
  os_replacement: 'iOS'
1387
1452
  os_v1_replacement: '11'
1388
1453
  os_v2_replacement: '1'
1389
- - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+'
1454
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.3\.\d+'
1390
1455
  os_replacement: 'iOS'
1391
1456
  os_v1_replacement: '11'
1392
1457
  os_v2_replacement: '2'
1393
- - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+'
1458
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.4\.\d+'
1394
1459
  os_replacement: 'iOS'
1395
1460
  os_v1_replacement: '11'
1396
1461
  os_v2_replacement: '2'
1397
1462
  os_v3_replacement: '6'
1398
- - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+'
1463
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.5\.\d+'
1399
1464
  os_replacement: 'iOS'
1400
1465
  os_v1_replacement: '11'
1401
1466
  os_v2_replacement: '3'
1402
- - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+'
1467
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.6\.\d+'
1403
1468
  os_replacement: 'iOS'
1404
1469
  os_v1_replacement: '11'
1405
1470
  os_v2_replacement: '4'
1406
- - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+'
1471
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.7\.\d+'
1407
1472
  os_replacement: 'iOS'
1408
1473
  os_v1_replacement: '11'
1409
1474
  os_v2_replacement: '4'
1410
1475
  os_v3_replacement: '1'
1411
- - regex: 'CFNetwork/8.* Darwin/(17)\.\d+'
1476
+ - regex: 'CFNetwork/8.{0,100} Darwin/(17)\.\d+'
1412
1477
  os_replacement: 'iOS'
1413
1478
  os_v1_replacement: '11'
1414
- - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+'
1479
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.0\.\d+'
1415
1480
  os_replacement: 'iOS'
1416
1481
  os_v1_replacement: '12'
1417
1482
  os_v2_replacement: '0'
1418
- - regex: 'CFNetwork/9.* Darwin/(18)\.\d+'
1483
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.2\.\d+'
1484
+ os_replacement: 'iOS'
1485
+ os_v1_replacement: '12'
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+'
1419
1496
  os_replacement: 'iOS'
1420
1497
  os_v1_replacement: '12'
1421
- - regex: 'CFNetwork/.* Darwin/'
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/'
1422
1546
  os_replacement: 'iOS'
1423
1547
 
1424
1548
  # iOS Apps
@@ -1472,9 +1596,9 @@ os_parsers:
1472
1596
  ##########
1473
1597
  - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
1474
1598
  os_replacement: 'Symbian OS'
1475
- - regex: '(Symbian/3).+NokiaBrowser/7\.3'
1599
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.3'
1476
1600
  os_replacement: 'Symbian^3 Anna'
1477
- - regex: '(Symbian/3).+NokiaBrowser/7\.4'
1601
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.4'
1478
1602
  os_replacement: 'Symbian^3 Belle'
1479
1603
  - regex: '(Symbian/3)'
1480
1604
  os_replacement: 'Symbian^3'
@@ -1491,11 +1615,11 @@ os_parsers:
1491
1615
  ##########
1492
1616
  # BlackBerry devices
1493
1617
  ##########
1494
- - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
1618
+ - regex: '(BB10);.{1,200}Version/(\d+)\.(\d+)\.(\d+)'
1495
1619
  os_replacement: 'BlackBerry OS'
1496
1620
  - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1497
1621
  os_replacement: 'BlackBerry OS'
1498
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1622
+ - regex: '(Black[Bb]erry).{1,200}Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1499
1623
  os_replacement: 'BlackBerry OS'
1500
1624
  - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
1501
1625
  os_replacement: 'BlackBerry Tablet OS'
@@ -1513,44 +1637,44 @@ os_parsers:
1513
1637
  ##########
1514
1638
  # Firefox OS
1515
1639
  ##########
1516
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
1640
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.0 Firefox/\d+\.\d+'
1517
1641
  os_replacement: 'Firefox OS'
1518
1642
  os_v1_replacement: '1'
1519
1643
  os_v2_replacement: '0'
1520
1644
  os_v3_replacement: '1'
1521
1645
 
1522
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
1646
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.1 Firefox/\d+\.\d+'
1523
1647
  os_replacement: 'Firefox OS'
1524
1648
  os_v1_replacement: '1'
1525
1649
  os_v2_replacement: '1'
1526
1650
 
1527
- - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
1651
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/26.0 Firefox/\d+\.\d+'
1528
1652
  os_replacement: 'Firefox OS'
1529
1653
  os_v1_replacement: '1'
1530
1654
  os_v2_replacement: '2'
1531
1655
 
1532
- - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
1656
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/28.0 Firefox/\d+\.\d+'
1533
1657
  os_replacement: 'Firefox OS'
1534
1658
  os_v1_replacement: '1'
1535
1659
  os_v2_replacement: '3'
1536
1660
 
1537
- - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
1661
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/30.0 Firefox/\d+\.\d+'
1538
1662
  os_replacement: 'Firefox OS'
1539
1663
  os_v1_replacement: '1'
1540
1664
  os_v2_replacement: '4'
1541
1665
 
1542
- - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
1666
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/32.0 Firefox/\d+\.\d+'
1543
1667
  os_replacement: 'Firefox OS'
1544
1668
  os_v1_replacement: '2'
1545
1669
  os_v2_replacement: '0'
1546
1670
 
1547
- - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
1671
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\d+\.\d+'
1548
1672
  os_replacement: 'Firefox OS'
1549
1673
  os_v1_replacement: '2'
1550
1674
  os_v2_replacement: '1'
1551
1675
 
1552
1676
  # Firefox OS Generic
1553
- - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
1677
+ - regex: '\((?:Mobile|Tablet);.{1,200}Firefox/\d+\.\d+'
1554
1678
  os_replacement: 'Firefox OS'
1555
1679
 
1556
1680
 
@@ -1592,7 +1716,7 @@ os_parsers:
1592
1716
  - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
1593
1717
 
1594
1718
  # Gentoo Linux + Kernel Version
1595
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
1719
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).{0,100}gentoo'
1596
1720
  os_replacement: 'Gentoo'
1597
1721
 
1598
1722
  # Opera Mini Bada
@@ -1624,19 +1748,19 @@ device_parsers:
1624
1748
  # Mobile Spiders
1625
1749
  # Catch the mobile crawler before checking for iPhones / Androids.
1626
1750
  #########
1627
- - 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)'
1628
1752
  regex_flag: 'i'
1629
1753
  device_replacement: 'Spider'
1630
1754
  brand_replacement: 'Spider'
1631
1755
  model_replacement: 'Smartphone'
1632
- - 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)'
1633
1757
  regex_flag: 'i'
1634
1758
  device_replacement: 'Spider'
1635
1759
  brand_replacement: 'Spider'
1636
1760
  model_replacement: 'Feature Phone'
1637
1761
 
1638
1762
  # PTST / WebPageTest.org crawlers
1639
- - regex: ' PTST/\d+(?:\.)?\d+$'
1763
+ - regex: ' PTST/\d+(?:\.\d+|)$'
1640
1764
  device_replacement: 'Spider'
1641
1765
  brand_replacement: 'Spider'
1642
1766
 
@@ -1646,11 +1770,11 @@ device_parsers:
1646
1770
  brand_replacement: 'Spider'
1647
1771
 
1648
1772
  # aspiegel.com spider (owned by Huawei)
1649
- - regex: 'Mozilla.*Mobile.*AspiegelBot'
1773
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
1650
1774
  device_replacement: 'Spider'
1651
1775
  brand_replacement: 'Spider'
1652
1776
  model_replacement: 'Smartphone'
1653
- - regex: 'Mozilla.*AspiegelBot'
1777
+ - regex: 'Mozilla.{0,200}AspiegelBot'
1654
1778
  device_replacement: 'Spider'
1655
1779
  brand_replacement: 'Spider'
1656
1780
  model_replacement: 'Desktop'
@@ -1659,7 +1783,7 @@ device_parsers:
1659
1783
  # WebBrowser for SmartWatch
1660
1784
  # @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
1661
1785
  #########
1662
- - regex: '\bSmartWatch {0,2}\( {0,2}([^;]+) {0,2}; {0,2}([^;]+) {0,2};'
1786
+ - regex: '\bSmartWatch {0,2}\( {0,2}([^;]{1,200}) {0,2}; {0,2}([^;]{1,200}) {0,2};'
1663
1787
  device_replacement: '$1 $2'
1664
1788
  brand_replacement: '$1'
1665
1789
  model_replacement: '$2'
@@ -1671,16 +1795,16 @@ device_parsers:
1671
1795
  ######################################################################
1672
1796
 
1673
1797
  # Android Application
1674
- - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
1798
+ - regex: 'Android Application[^\-]{1,300} - (Sony) ?(Ericsson|) (.{1,200}) \w{1,20} - '
1675
1799
  device_replacement: '$1 $2'
1676
1800
  brand_replacement: '$1$2'
1677
1801
  model_replacement: '$3'
1678
- - 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} - '
1679
1803
  regex_flag: 'i'
1680
1804
  device_replacement: '$1 $2'
1681
1805
  brand_replacement: '$1'
1682
1806
  model_replacement: '$2'
1683
- - regex: 'Android Application[^\-]+ - ([^ ]+) (.+) \w+ - '
1807
+ - regex: 'Android Application[^\-]{1,300} - ([^ ]+) (.{1,200}) \w{1,20} - '
1684
1808
  device_replacement: '$1 $2'
1685
1809
  brand_replacement: '$1'
1686
1810
  model_replacement: '$2'
@@ -1689,11 +1813,11 @@ device_parsers:
1689
1813
  # 3Q
1690
1814
  # @ref: http://www.3q-int.com/
1691
1815
  #########
1692
- - regex: '; *([BLRQ]C\d{4}[A-Z]+?)(?: Build|\) AppleWebKit)'
1816
+ - regex: '; {0,2}([BLRQ]C\d{4}[A-Z]{1,100}?)(?: Build|\) AppleWebKit)'
1693
1817
  device_replacement: '3Q $1'
1694
1818
  brand_replacement: '3Q'
1695
1819
  model_replacement: '$1'
1696
- - regex: '; *(?:3Q_)([^;/]+?)(?: Build|\) AppleWebKit)'
1820
+ - regex: '; {0,2}(?:3Q_)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1697
1821
  device_replacement: '3Q $1'
1698
1822
  brand_replacement: '3Q'
1699
1823
  model_replacement: '$1'
@@ -1702,19 +1826,19 @@ device_parsers:
1702
1826
  # Acer
1703
1827
  # @ref: http://us.acer.com/ac/en/US/content/group/tablets
1704
1828
  #########
1705
- - 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|\) AppleWebKit)'
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)'
1706
1830
  device_replacement: '$1'
1707
1831
  brand_replacement: 'Acer'
1708
1832
  model_replacement: '$1'
1709
- - regex: '; *Acer Iconia Tab ([^;/]+?)(?: Build|\) AppleWebKit)'
1833
+ - regex: '; {0,2}Acer Iconia Tab ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1710
1834
  device_replacement: '$1'
1711
1835
  brand_replacement: 'Acer'
1712
1836
  model_replacement: '$1'
1713
- - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+)(?: Build|\) AppleWebKit)'
1837
+ - regex: '; {0,2}(Z1[1235]0|E320[^/]{0,10}|S500|S510|Liquid[^;/]{0,30}|Iconia A\d+)(?: Build|\) AppleWebKit)'
1714
1838
  device_replacement: '$1'
1715
1839
  brand_replacement: 'Acer'
1716
1840
  model_replacement: '$1'
1717
- - regex: '; *(Acer |ACER )([^;/]+?)(?: Build|\) AppleWebKit)'
1841
+ - regex: '; {0,2}(Acer |ACER )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1718
1842
  device_replacement: '$1$2'
1719
1843
  brand_replacement: 'Acer'
1720
1844
  model_replacement: '$2'
@@ -1725,7 +1849,7 @@ device_parsers:
1725
1849
  # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
1726
1850
  # custom ROM builds for Vega
1727
1851
  #########
1728
- - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\) AppleWebKit)'
1852
+ - regex: '; {0,2}(Advent |)(Vega(?:Bean|Comb|)).{0,200}?(?: Build|\) AppleWebKit)'
1729
1853
  device_replacement: '$1$2'
1730
1854
  brand_replacement: 'Advent'
1731
1855
  model_replacement: '$2'
@@ -1734,7 +1858,7 @@ device_parsers:
1734
1858
  # Ainol
1735
1859
  # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
1736
1860
  #########
1737
- - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\) AppleWebKit)'
1861
+ - regex: '; {0,2}(Ainol |)((?:NOVO|[Nn]ovo)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1738
1862
  device_replacement: '$1$2'
1739
1863
  brand_replacement: 'Ainol'
1740
1864
  model_replacement: '$2'
@@ -1743,12 +1867,12 @@ device_parsers:
1743
1867
  # Airis
1744
1868
  # @ref: http://airis.es/Tienda/Default.aspx?idG=001
1745
1869
  #########
1746
- - regex: '; *AIRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
1870
+ - regex: '; {0,2}AIRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
1747
1871
  regex_flag: 'i'
1748
1872
  device_replacement: '$1'
1749
1873
  brand_replacement: 'Airis'
1750
1874
  model_replacement: '$1'
1751
- - regex: '; *(OnePAD[^;/]+?)(?: Build|\) AppleWebKit)'
1875
+ - regex: '; {0,2}(OnePAD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1752
1876
  regex_flag: 'i'
1753
1877
  device_replacement: '$1'
1754
1878
  brand_replacement: 'Airis'
@@ -1758,7 +1882,7 @@ device_parsers:
1758
1882
  # Airpad
1759
1883
  # @ref: ??
1760
1884
  #########
1761
- - regex: '; *Airpad[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
1885
+ - regex: '; {0,2}Airpad[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1762
1886
  device_replacement: 'Airpad $1'
1763
1887
  brand_replacement: 'Airpad'
1764
1888
  model_replacement: '$1'
@@ -1767,29 +1891,29 @@ device_parsers:
1767
1891
  # Alcatel - TCT
1768
1892
  # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
1769
1893
  #########
1770
- - regex: '; *(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1894
+ - regex: '; {0,2}(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1771
1895
  device_replacement: 'Alcatel One Touch $2'
1772
1896
  brand_replacement: 'Alcatel'
1773
1897
  model_replacement: 'One Touch $2'
1774
- - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+?)(?: Build|\) AppleWebKit)'
1898
+ - regex: '; {0,2}(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1775
1899
  regex_flag: 'i'
1776
1900
  device_replacement: 'Alcatel One Touch $1'
1777
1901
  brand_replacement: 'Alcatel'
1778
1902
  model_replacement: 'One Touch $1'
1779
- - regex: '; *(TCL)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1903
+ - regex: '; {0,2}(TCL)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1780
1904
  device_replacement: '$1 $2'
1781
1905
  brand_replacement: '$1'
1782
1906
  model_replacement: '$2'
1783
1907
  # operator specific models
1784
- - regex: '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1908
+ - regex: '; {0,2}(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1785
1909
  device_replacement: 'Alcatel $1'
1786
1910
  brand_replacement: 'Alcatel'
1787
1911
  model_replacement: '$1'
1788
- - regex: '; *BASE_Lutea_3(?: Build|\) AppleWebKit)'
1912
+ - regex: '; {0,2}BASE_Lutea_3(?: Build|\) AppleWebKit)'
1789
1913
  device_replacement: 'Alcatel One Touch 998'
1790
1914
  brand_replacement: 'Alcatel'
1791
1915
  model_replacement: 'One Touch 998'
1792
- - regex: '; *BASE_Varia(?: Build|\) AppleWebKit)'
1916
+ - regex: '; {0,2}BASE_Varia(?: Build|\) AppleWebKit)'
1793
1917
  device_replacement: 'Alcatel One Touch 918D'
1794
1918
  brand_replacement: 'Alcatel'
1795
1919
  model_replacement: 'One Touch 918D'
@@ -1798,7 +1922,7 @@ device_parsers:
1798
1922
  # Allfine
1799
1923
  # @ref: http://www.myallfine.com/Products.asp
1800
1924
  #########
1801
- - regex: '; *((?:FINE|Fine)\d[^;/]+?)(?: Build|\) AppleWebKit)'
1925
+ - regex: '; {0,2}((?:FINE|Fine)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1802
1926
  device_replacement: '$1'
1803
1927
  brand_replacement: 'Allfine'
1804
1928
  model_replacement: '$1'
@@ -1807,15 +1931,15 @@ device_parsers:
1807
1931
  # Allview
1808
1932
  # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
1809
1933
  #########
1810
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\) AppleWebKit)'
1934
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).{0,200}?)(?: Build|\) AppleWebKit)'
1811
1935
  device_replacement: '$1$2'
1812
1936
  brand_replacement: 'Allview'
1813
1937
  model_replacement: '$2'
1814
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1938
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1815
1939
  device_replacement: '$1$2'
1816
1940
  brand_replacement: 'Allview'
1817
1941
  model_replacement: '$2'
1818
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1942
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1819
1943
  device_replacement: '$1$2'
1820
1944
  brand_replacement: 'Allview'
1821
1945
  model_replacement: '$2'
@@ -1825,11 +1949,11 @@ device_parsers:
1825
1949
  # @ref: http://www.allwinner.com/
1826
1950
  # @models: A31 (13.3"),A20,A10,
1827
1951
  #########
1828
- - regex: '; *(A13-MID)(?: Build|\) AppleWebKit)'
1952
+ - regex: '; {0,2}(A13-MID)(?: Build|\) AppleWebKit)'
1829
1953
  device_replacement: '$1'
1830
1954
  brand_replacement: 'Allwinner'
1831
1955
  model_replacement: '$1'
1832
- - regex: '; *(Allwinner)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
1956
+ - regex: '; {0,2}(Allwinner)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1833
1957
  device_replacement: '$1 $2'
1834
1958
  brand_replacement: 'Allwinner'
1835
1959
  model_replacement: '$1'
@@ -1838,7 +1962,7 @@ device_parsers:
1838
1962
  # Amaway
1839
1963
  # @ref: http://www.amaway.cn/
1840
1964
  #########
1841
- - 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|\) AppleWebKit)'
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)'
1842
1966
  device_replacement: '$1'
1843
1967
  brand_replacement: 'Amaway'
1844
1968
  model_replacement: '$1'
@@ -1847,11 +1971,11 @@ device_parsers:
1847
1971
  # Amoi
1848
1972
  # @ref: http://www.amoi.com/en/prd/prd_index.jspx
1849
1973
  #########
1850
- - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1974
+ - regex: '; {0,2}(?:AMOI|Amoi)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1851
1975
  device_replacement: 'Amoi $1'
1852
1976
  brand_replacement: 'Amoi'
1853
1977
  model_replacement: '$1'
1854
- - regex: '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux'
1978
+ - regex: '^(?:AMOI|Amoi)[ _]([^;/]{1,100}?) Linux'
1855
1979
  device_replacement: 'Amoi $1'
1856
1980
  brand_replacement: 'Amoi'
1857
1981
  model_replacement: '$1'
@@ -1860,7 +1984,7 @@ device_parsers:
1860
1984
  # Aoc
1861
1985
  # @ref: http://latin.aoc.com/media_tablet
1862
1986
  #########
1863
- - regex: '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\) AppleWebKit)'
1987
+ - regex: '; {0,2}(MW(?:0[789]|10)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1864
1988
  device_replacement: '$1'
1865
1989
  brand_replacement: 'Aoc'
1866
1990
  model_replacement: '$1'
@@ -1871,11 +1995,11 @@ device_parsers:
1871
1995
  # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
1872
1996
  # @note: brand owned by luckystar
1873
1997
  #########
1874
- - 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|\) AppleWebKit)'
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)'
1875
1999
  device_replacement: 'Aoson $1'
1876
2000
  brand_replacement: 'Aoson'
1877
2001
  model_replacement: '$1'
1878
- - regex: '; *Aoson ([^;/]+?)(?: Build|\) AppleWebKit)'
2002
+ - regex: '; {0,2}Aoson ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1879
2003
  regex_flag: 'i'
1880
2004
  device_replacement: 'Aoson $1'
1881
2005
  brand_replacement: 'Aoson'
@@ -1885,7 +2009,7 @@ device_parsers:
1885
2009
  # Apanda
1886
2010
  # @ref: http://www.apanda.com.cn/
1887
2011
  #########
1888
- - regex: '; *[Aa]panda[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2012
+ - regex: '; {0,2}[Aa]panda[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1889
2013
  device_replacement: 'Apanda $1'
1890
2014
  brand_replacement: 'Apanda'
1891
2015
  model_replacement: '$1'
@@ -1895,23 +2019,23 @@ device_parsers:
1895
2019
  # @ref: http://www.archos.com/de/products/tablets.html
1896
2020
  # @ref: http://www.archos.com/de/products/smartphones/index.html
1897
2021
  #########
1898
- - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\) AppleWebKit)'
2022
+ - regex: '; {0,2}(?:ARCHOS|Archos) ?(GAMEPAD.{0,200}?)(?: Build|\) AppleWebKit)'
1899
2023
  device_replacement: 'Archos $1'
1900
2024
  brand_replacement: 'Archos'
1901
2025
  model_replacement: '$1'
1902
- - regex: 'ARCHOS; GOGI; ([^;]+);'
2026
+ - regex: 'ARCHOS; GOGI; ([^;]{1,200});'
1903
2027
  device_replacement: 'Archos $1'
1904
2028
  brand_replacement: 'Archos'
1905
2029
  model_replacement: '$1'
1906
- - regex: '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\(\)\-]|$)'
2030
+ - regex: '(?:ARCHOS|Archos)[ _]?(.{0,200}?)(?: Build|[;/\(\)\-]|$)'
1907
2031
  device_replacement: 'Archos $1'
1908
2032
  brand_replacement: 'Archos'
1909
2033
  model_replacement: '$1'
1910
- - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
2034
+ - regex: '; {0,2}(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
1911
2035
  device_replacement: 'Archos $1'
1912
2036
  brand_replacement: 'Archos'
1913
2037
  model_replacement: '$1'
1914
- - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
2038
+ - regex: '; {0,2}(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
1915
2039
  device_replacement: 'Archos $1'
1916
2040
  brand_replacement: 'Archos'
1917
2041
  model_replacement: '$1'
@@ -1920,11 +2044,11 @@ device_parsers:
1920
2044
  # A-rival
1921
2045
  # @ref: http://www.a-rival.de/de/
1922
2046
  #########
1923
- - regex: '; *(PAD-FMD[^;/]+?)(?: Build|\) AppleWebKit)'
2047
+ - regex: '; {0,2}(PAD-FMD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1924
2048
  device_replacement: '$1'
1925
2049
  brand_replacement: 'Arival'
1926
2050
  model_replacement: '$1'
1927
- - regex: '; *(BioniQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2051
+ - regex: '; {0,2}(BioniQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1928
2052
  device_replacement: '$1 $2'
1929
2053
  brand_replacement: 'Arival'
1930
2054
  model_replacement: '$1 $2'
@@ -1933,11 +2057,11 @@ device_parsers:
1933
2057
  # Arnova
1934
2058
  # @ref: http://arnovatech.com/
1935
2059
  #########
1936
- - regex: '; *(AN\d[^;/]+|ARCHM\d+)(?: Build|\) AppleWebKit)'
2060
+ - regex: '; {0,2}(AN\d[^;/]{1,100}|ARCHM\d+)(?: Build|\) AppleWebKit)'
1937
2061
  device_replacement: 'Arnova $1'
1938
2062
  brand_replacement: 'Arnova'
1939
2063
  model_replacement: '$1'
1940
- - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2064
+ - regex: '; {0,2}(?:ARNOVA|Arnova) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1941
2065
  device_replacement: 'Arnova $1'
1942
2066
  brand_replacement: 'Arnova'
1943
2067
  model_replacement: '$1'
@@ -1946,7 +2070,7 @@ device_parsers:
1946
2070
  # Assistant
1947
2071
  # @ref: http://www.assistant.ua
1948
2072
  #########
1949
- - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
2073
+ - regex: '; {0,2}(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
1950
2074
  device_replacement: 'Assistant $1-$2'
1951
2075
  brand_replacement: 'Assistant'
1952
2076
  model_replacement: '$1-$2'
@@ -1955,11 +2079,11 @@ device_parsers:
1955
2079
  # Asus
1956
2080
  # @ref: http://www.asus.com/uk/Tablets_Mobile/
1957
2081
  #########
1958
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
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)'
1959
2083
  device_replacement: 'Asus $1'
1960
2084
  brand_replacement: 'Asus'
1961
2085
  model_replacement: '$1'
1962
- - regex: '; *ASUS[ _]*([^;/]+?)(?: Build|\) AppleWebKit)'
2086
+ - regex: '; {0,2}ASUS[ _]{0,10}([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1963
2087
  device_replacement: 'Asus $1'
1964
2088
  brand_replacement: 'Asus'
1965
2089
  model_replacement: '$1'
@@ -1967,11 +2091,11 @@ device_parsers:
1967
2091
  #########
1968
2092
  # Garmin-Asus
1969
2093
  #########
1970
- - regex: '; *Garmin-Asus ([^;/]+?)(?: Build|\) AppleWebKit)'
2094
+ - regex: '; {0,2}Garmin-Asus ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1971
2095
  device_replacement: 'Garmin-Asus $1'
1972
2096
  brand_replacement: 'Garmin-Asus'
1973
2097
  model_replacement: '$1'
1974
- - regex: '; *(Garminfone)(?: Build|\) AppleWebKit)'
2098
+ - regex: '; {0,2}(Garminfone)(?: Build|\) AppleWebKit)'
1975
2099
  device_replacement: 'Garmin $1'
1976
2100
  brand_replacement: 'Garmin-Asus'
1977
2101
  model_replacement: '$1'
@@ -1980,7 +2104,7 @@ device_parsers:
1980
2104
  # Attab
1981
2105
  # @ref: http://www.theattab.com/
1982
2106
  #########
1983
- - regex: '; (@TAB-[^;/]+?)(?: Build|\) AppleWebKit)'
2107
+ - regex: '; (@TAB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1984
2108
  device_replacement: '$1'
1985
2109
  brand_replacement: 'Attab'
1986
2110
  model_replacement: '$1'
@@ -1990,7 +2114,7 @@ device_parsers:
1990
2114
  # @ref: ??
1991
2115
  # @note: Take care with Docomo T-01 Toshiba
1992
2116
  #########
1993
- - regex: '; *(T-(?:07|[^0]\d)[^;/]+?)(?: Build|\) AppleWebKit)'
2117
+ - regex: '; {0,2}(T-(?:07|[^0]\d)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1994
2118
  device_replacement: '$1'
1995
2119
  brand_replacement: 'Audiosonic'
1996
2120
  model_replacement: '$1'
@@ -1999,7 +2123,7 @@ device_parsers:
1999
2123
  # Axioo
2000
2124
  # @ref: http://www.axiooworld.com/ww/index.php
2001
2125
  #########
2002
- - regex: '; *(?:Axioo[ _\-]([^;/]+?)|(picopad)[ _\-]([^;/]+?))(?: Build|\) AppleWebKit)'
2126
+ - regex: '; {0,2}(?:Axioo[ _\-]([^;/]{1,100}?)|(picopad)[ _\-]([^;/]{1,100}?))(?: Build|\) AppleWebKit)'
2003
2127
  regex_flag: 'i'
2004
2128
  device_replacement: 'Axioo $1$2 $3'
2005
2129
  brand_replacement: 'Axioo'
@@ -2009,7 +2133,7 @@ device_parsers:
2009
2133
  # Azend
2010
2134
  # @ref: http://azendcorp.com/index.php/products/portable-electronics
2011
2135
  #########
2012
- - regex: '; *(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
2136
+ - regex: '; {0,2}(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
2013
2137
  device_replacement: '$1'
2014
2138
  brand_replacement: 'Azend'
2015
2139
  model_replacement: '$1'
@@ -2018,7 +2142,7 @@ device_parsers:
2018
2142
  # Bak
2019
2143
  # @ref: http://www.bakinternational.com/produtos.php?cat=80
2020
2144
  #########
2021
- - regex: '; *(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
2145
+ - regex: '; {0,2}(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
2022
2146
  regex_flag: 'i'
2023
2147
  device_replacement: '$1'
2024
2148
  brand_replacement: 'Bak'
@@ -2029,7 +2153,7 @@ device_parsers:
2029
2153
  # @ref: http://www.bedove.com/product.html
2030
2154
  # @models: HY6501|HY5001|X12|X21|I5
2031
2155
  #########
2032
- - regex: '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
2156
+ - regex: '; {0,2}(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
2033
2157
  device_replacement: 'Bedove $1'
2034
2158
  brand_replacement: 'Bedove'
2035
2159
  model_replacement: '$1'
@@ -2038,7 +2162,7 @@ device_parsers:
2038
2162
  # Benss
2039
2163
  # @ref: http://www.benss.net/
2040
2164
  #########
2041
- - regex: '; *(JC-[^;/]*)(?: Build|\) AppleWebKit)'
2165
+ - regex: '; {0,2}(JC-[^;/]*)(?: Build|\) AppleWebKit)'
2042
2166
  device_replacement: 'Benss $1'
2043
2167
  brand_replacement: 'Benss'
2044
2168
  model_replacement: '$1'
@@ -2048,7 +2172,7 @@ device_parsers:
2048
2172
  # @ref: http://uk.blackberry.com/
2049
2173
  # @note: Android Apps seams to be used here
2050
2174
  #########
2051
- - regex: '; *(BB) ([^;/]+?)(?: Build|\) AppleWebKit)'
2175
+ - regex: '; {0,2}(BB) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2052
2176
  device_replacement: '$1 $2'
2053
2177
  brand_replacement: 'Blackberry'
2054
2178
  model_replacement: '$2'
@@ -2057,11 +2181,11 @@ device_parsers:
2057
2181
  # Blackbird
2058
2182
  # @ref: http://iblackbird.co.kr
2059
2183
  #########
2060
- - regex: '; *(BlackBird)[ _](I8.*?)(?: Build|\) AppleWebKit)'
2184
+ - regex: '; {0,2}(BlackBird)[ _](I8.{0,200}?)(?: Build|\) AppleWebKit)'
2061
2185
  device_replacement: '$1 $2'
2062
2186
  brand_replacement: '$1'
2063
2187
  model_replacement: '$2'
2064
- - regex: '; *(BlackBird)[ _](.*?)(?: Build|\) AppleWebKit)'
2188
+ - regex: '; {0,2}(BlackBird)[ _](.{0,200}?)(?: Build|\) AppleWebKit)'
2065
2189
  device_replacement: '$1 $2'
2066
2190
  brand_replacement: '$1'
2067
2191
  model_replacement: '$2'
@@ -2071,7 +2195,7 @@ device_parsers:
2071
2195
  # @ref: http://www.blaupunkt.com
2072
2196
  #########
2073
2197
  # Endeavour
2074
- - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\) AppleWebKit)'
2198
+ - regex: '; {0,2}([0-9]+BP[EM][^;/]*|Endeavour[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2075
2199
  device_replacement: 'Blaupunkt $1'
2076
2200
  brand_replacement: 'Blaupunkt'
2077
2201
  model_replacement: '$1'
@@ -2080,12 +2204,12 @@ device_parsers:
2080
2204
  # Blu
2081
2205
  # @ref: http://bluproducts.com
2082
2206
  #########
2083
- - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
2207
+ - regex: '; {0,2}((?:BLU|Blu)[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2084
2208
  device_replacement: '$1$2'
2085
2209
  brand_replacement: 'Blu'
2086
2210
  model_replacement: '$2'
2087
2211
  # BMOBILE = operator branded device
2088
- - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2212
+ - regex: '; {0,2}(?:BMOBILE )?(Blu|BLU|DASH [^;/]{1,100}|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2089
2213
  device_replacement: '$1'
2090
2214
  brand_replacement: 'Blu'
2091
2215
  model_replacement: '$1'
@@ -2095,7 +2219,7 @@ device_parsers:
2095
2219
  # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
2096
2220
  #########
2097
2221
  # tablet
2098
- - regex: '; *(TOUCH\d[^;/]+?)(?: Build|\) AppleWebKit)'
2222
+ - regex: '; {0,2}(TOUCH\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2099
2223
  device_replacement: '$1'
2100
2224
  brand_replacement: 'Blusens'
2101
2225
  model_replacement: '$1'
@@ -2106,7 +2230,7 @@ device_parsers:
2106
2230
  # @note: Might collide with Maxx as AX is used also there.
2107
2231
  #########
2108
2232
  # smartphone
2109
- - regex: '; *(AX5\d+)(?: Build|\) AppleWebKit)'
2233
+ - regex: '; {0,2}(AX5\d+)(?: Build|\) AppleWebKit)'
2110
2234
  device_replacement: '$1'
2111
2235
  brand_replacement: 'Bmobile'
2112
2236
  model_replacement: '$1'
@@ -2115,11 +2239,11 @@ device_parsers:
2115
2239
  # bq
2116
2240
  # @ref: http://bqreaders.com
2117
2241
  #########
2118
- - regex: '; *([Bb]q) ([^;/]+?);?(?: Build|\) AppleWebKit)'
2242
+ - regex: '; {0,2}([Bb]q) ([^;/]{1,100}?);?(?: Build|\) AppleWebKit)'
2119
2243
  device_replacement: '$1 $2'
2120
2244
  brand_replacement: 'bq'
2121
2245
  model_replacement: '$2'
2122
- - regex: '; *(Maxwell [^;/]+?)(?: Build|\) AppleWebKit)'
2246
+ - regex: '; {0,2}(Maxwell [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2123
2247
  device_replacement: '$1'
2124
2248
  brand_replacement: 'bq'
2125
2249
  model_replacement: '$1'
@@ -2128,7 +2252,7 @@ device_parsers:
2128
2252
  # Braun Phototechnik
2129
2253
  # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
2130
2254
  #########
2131
- - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+?)(?: Build|\) AppleWebKit)'
2255
+ - regex: '; {0,2}((?:B-Tab|B-TAB) ?\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2132
2256
  device_replacement: '$1'
2133
2257
  brand_replacement: 'Braun'
2134
2258
  model_replacement: '$1'
@@ -2137,7 +2261,7 @@ device_parsers:
2137
2261
  # Broncho
2138
2262
  # @ref: http://www.broncho.cn/
2139
2263
  #########
2140
- - regex: '; *(Broncho) ([^;/]+?)(?: Build|\) AppleWebKit)'
2264
+ - regex: '; {0,2}(Broncho) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2141
2265
  device_replacement: '$1 $2'
2142
2266
  brand_replacement: '$1'
2143
2267
  model_replacement: '$2'
@@ -2146,7 +2270,7 @@ device_parsers:
2146
2270
  # Captiva
2147
2271
  # @ref: http://www.captiva-power.de
2148
2272
  #########
2149
- - regex: '; *CAPTIVA ([^;/]+?)(?: Build|\) AppleWebKit)'
2273
+ - regex: '; {0,2}CAPTIVA ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2150
2274
  device_replacement: 'Captiva $1'
2151
2275
  brand_replacement: 'Captiva'
2152
2276
  model_replacement: '$1'
@@ -2155,7 +2279,7 @@ device_parsers:
2155
2279
  # Casio
2156
2280
  # @ref: http://www.casiogzone.com/
2157
2281
  #########
2158
- - regex: '; *(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2282
+ - regex: '; {0,2}(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2159
2283
  device_replacement: '$1'
2160
2284
  brand_replacement: 'Casio'
2161
2285
  model_replacement: '$1'
@@ -2164,15 +2288,15 @@ device_parsers:
2164
2288
  # Cat
2165
2289
  # @ref: http://www.cat-sound.com
2166
2290
  #########
2167
- - regex: '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\) AppleWebKit)'
2291
+ - regex: '; {0,2}(?:Cat|CAT) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2168
2292
  device_replacement: 'Cat $1'
2169
2293
  brand_replacement: 'Cat'
2170
2294
  model_replacement: '$1'
2171
- - regex: '; *(?:Cat)(Nova.*?)(?: Build|\) AppleWebKit)'
2295
+ - regex: '; {0,2}(?:Cat)(Nova.{0,200}?)(?: Build|\) AppleWebKit)'
2172
2296
  device_replacement: 'Cat $1'
2173
2297
  brand_replacement: 'Cat'
2174
2298
  model_replacement: '$1'
2175
- - regex: '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2299
+ - regex: '; {0,2}(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2176
2300
  device_replacement: '$1'
2177
2301
  brand_replacement: 'Cat'
2178
2302
  model_replacement: 'Tablet PHOENIX 8.1J0'
@@ -2182,7 +2306,7 @@ device_parsers:
2182
2306
  # @ref: http://www.celkonmobiles.com/?_a=products
2183
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
2184
2308
  #########
2185
- - regex: '; *(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2309
+ - regex: '; {0,2}(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2186
2310
  device_replacement: '$1'
2187
2311
  brand_replacement: 'Celkon'
2188
2312
  model_replacement: '$1'
@@ -2190,12 +2314,12 @@ device_parsers:
2190
2314
  device_replacement: '$1'
2191
2315
  brand_replacement: 'Celkon'
2192
2316
  model_replacement: '$1'
2193
- - regex: '; *(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2317
+ - regex: '; {0,2}(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2194
2318
  device_replacement: '$1$2'
2195
2319
  brand_replacement: 'Celkon'
2196
2320
  model_replacement: '$1$2'
2197
2321
  # smartphones
2198
- - regex: '; *(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2322
+ - regex: '; {0,2}(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2199
2323
  device_replacement: '$1'
2200
2324
  brand_replacement: 'Celkon'
2201
2325
  model_replacement: '$1'
@@ -2206,7 +2330,7 @@ device_parsers:
2206
2330
  # @brief: China manufacturer makes tablets for different small brands
2207
2331
  # (eg. http://www.zeepad.net/index.html)
2208
2332
  #########
2209
- - regex: '; *(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2333
+ - regex: '; {0,2}(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2210
2334
  device_replacement: '$1'
2211
2335
  brand_replacement: 'ChangJia'
2212
2336
  model_replacement: '$1'
@@ -2215,15 +2339,15 @@ device_parsers:
2215
2339
  # Cloudfone
2216
2340
  # @ref: http://www.cloudfonemobile.com/
2217
2341
  #########
2218
- - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\) AppleWebKit)'
2342
+ - regex: '; {0,2}(Cloudfone)[ _](Excite)([^ ][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2219
2343
  device_replacement: '$1 $2 $3'
2220
2344
  brand_replacement: 'Cloudfone'
2221
2345
  model_replacement: '$1 $2 $3'
2222
- - regex: '; *(Excite|ICE)[ _](\d+[^;/]+?)(?: Build|\) AppleWebKit)'
2346
+ - regex: '; {0,2}(Excite|ICE)[ _](\d+[^;/]{0,100}?)(?: Build|\) AppleWebKit)'
2223
2347
  device_replacement: 'Cloudfone $1 $2'
2224
2348
  brand_replacement: 'Cloudfone'
2225
2349
  model_replacement: 'Cloudfone $1 $2'
2226
- - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2350
+ - regex: '; {0,2}(Cloudfone|CloudPad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2227
2351
  device_replacement: '$1 $2'
2228
2352
  brand_replacement: 'Cloudfone'
2229
2353
  model_replacement: '$1 $2'
@@ -2232,7 +2356,7 @@ device_parsers:
2232
2356
  # Cmx
2233
2357
  # @ref: http://cmx.at/de/
2234
2358
  #########
2235
- - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\) AppleWebKit)'
2359
+ - regex: '; {0,2}((?:Aquila|Clanga|Rapax)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2236
2360
  regex_flag: 'i'
2237
2361
  device_replacement: '$1'
2238
2362
  brand_replacement: 'Cmx'
@@ -2243,7 +2367,7 @@ device_parsers:
2243
2367
  # @ref: http://cobykyros.com
2244
2368
  # @note: Be careful with MID\d{3} from MpMan or Manta
2245
2369
  #########
2246
- - 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|[;\)])'
2247
2371
  device_replacement: 'CobyKyros $1$2'
2248
2372
  brand_replacement: 'CobyKyros'
2249
2373
  model_replacement: '$1$2'
@@ -2252,7 +2376,7 @@ device_parsers:
2252
2376
  # Coolpad
2253
2377
  # @ref: ??
2254
2378
  #########
2255
- - regex: '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2379
+ - regex: '; {0,2}([^;/]{0,50})Coolpad[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2256
2380
  device_replacement: '$1$2'
2257
2381
  brand_replacement: 'Coolpad'
2258
2382
  model_replacement: '$1$2'
@@ -2261,7 +2385,7 @@ device_parsers:
2261
2385
  # Cube
2262
2386
  # @ref: http://www.cube-tablet.com/buy-products.html
2263
2387
  #########
2264
- - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\) AppleWebKit)'
2388
+ - regex: '; {0,2}(CUBE[ _])?([KU][0-9]+ ?GT.{0,200}?|A5300)(?: Build|\) AppleWebKit)'
2265
2389
  regex_flag: 'i'
2266
2390
  device_replacement: '$1$2'
2267
2391
  brand_replacement: 'Cube'
@@ -2271,12 +2395,12 @@ device_parsers:
2271
2395
  # Cubot
2272
2396
  # @ref: http://www.cubotmall.com/
2273
2397
  #########
2274
- - regex: '; *CUBOT ([^;/]+?)(?: Build|\) AppleWebKit)'
2398
+ - regex: '; {0,2}CUBOT ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2275
2399
  regex_flag: 'i'
2276
2400
  device_replacement: '$1'
2277
2401
  brand_replacement: 'Cubot'
2278
2402
  model_replacement: '$1'
2279
- - regex: '; *(BOBBY)(?: Build|\) AppleWebKit)'
2403
+ - regex: '; {0,2}(BOBBY)(?: Build|\) AppleWebKit)'
2280
2404
  regex_flag: 'i'
2281
2405
  device_replacement: '$1'
2282
2406
  brand_replacement: 'Cubot'
@@ -2286,7 +2410,7 @@ device_parsers:
2286
2410
  # Danew
2287
2411
  # @ref: http://www.danew.com/produits-tablette.php
2288
2412
  #########
2289
- - regex: '; *(Dslide [^;/]+?)(?: Build|\) AppleWebKit)'
2413
+ - regex: '; {0,2}(Dslide [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2290
2414
  device_replacement: '$1'
2291
2415
  brand_replacement: 'Danew'
2292
2416
  model_replacement: '$1'
@@ -2300,39 +2424,39 @@ device_parsers:
2300
2424
  # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
2301
2425
  # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
2302
2426
  #########
2303
- - regex: '; *(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2427
+ - regex: '; {0,2}(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2304
2428
  device_replacement: 'Dell $1$2'
2305
2429
  brand_replacement: 'Dell'
2306
2430
  model_replacement: '$1$2'
2307
- - regex: '; *(001DL)(?: Build|\) AppleWebKit)'
2431
+ - regex: '; {0,2}(001DL)(?: Build|\) AppleWebKit)'
2308
2432
  device_replacement: 'Dell $1'
2309
2433
  brand_replacement: 'Dell'
2310
2434
  model_replacement: 'Streak'
2311
- - regex: '; *(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2435
+ - regex: '; {0,2}(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2312
2436
  device_replacement: 'Dell $1'
2313
2437
  brand_replacement: 'Dell'
2314
2438
  model_replacement: 'Streak'
2315
- - regex: '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\) AppleWebKit)'
2439
+ - regex: '; {0,2}(101DL|GS01|Streak Pro[^;/]{0,100})(?: Build|\) AppleWebKit)'
2316
2440
  device_replacement: 'Dell $1'
2317
2441
  brand_replacement: 'Dell'
2318
2442
  model_replacement: 'Streak Pro'
2319
- - regex: '; *([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2443
+ - regex: '; {0,2}([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2320
2444
  device_replacement: 'Dell $1'
2321
2445
  brand_replacement: 'Dell'
2322
2446
  model_replacement: 'Streak 7'
2323
- - regex: '; *(Mini-3iX)(?: Build|\) AppleWebKit)'
2447
+ - regex: '; {0,2}(Mini-3iX)(?: Build|\) AppleWebKit)'
2324
2448
  device_replacement: 'Dell $1'
2325
2449
  brand_replacement: 'Dell'
2326
2450
  model_replacement: '$1'
2327
- - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2451
+ - regex: '; {0,2}(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.{0,200}?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2328
2452
  device_replacement: 'Dell $1'
2329
2453
  brand_replacement: 'Dell'
2330
2454
  model_replacement: '$1'
2331
- - regex: '; *Dell[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2455
+ - regex: '; {0,2}Dell[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2332
2456
  device_replacement: 'Dell $1'
2333
2457
  brand_replacement: 'Dell'
2334
2458
  model_replacement: '$1'
2335
- - regex: '; *Dell ([^;/]+?)(?: Build|\) AppleWebKit)'
2459
+ - regex: '; {0,2}Dell ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2336
2460
  device_replacement: 'Dell $1'
2337
2461
  brand_replacement: 'Dell'
2338
2462
  model_replacement: '$1'
@@ -2341,7 +2465,7 @@ device_parsers:
2341
2465
  # Denver
2342
2466
  # @ref: http://www.denver-electronics.com/tablets1/
2343
2467
  #########
2344
- - regex: '; *(TA[CD]-\d+[^;/]*)(?: Build|\) AppleWebKit)'
2468
+ - regex: '; {0,2}(TA[CD]-\d+[^;/]{0,100})(?: Build|\) AppleWebKit)'
2345
2469
  device_replacement: '$1'
2346
2470
  brand_replacement: 'Denver'
2347
2471
  model_replacement: '$1'
@@ -2350,7 +2474,7 @@ device_parsers:
2350
2474
  # Dex
2351
2475
  # @ref: http://dex.ua/
2352
2476
  #########
2353
- - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2477
+ - regex: '; {0,2}(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2354
2478
  device_replacement: '$1'
2355
2479
  brand_replacement: 'Dex'
2356
2480
  model_replacement: '$1'
@@ -2359,7 +2483,7 @@ device_parsers:
2359
2483
  # DNS AirTab
2360
2484
  # @ref: http://www.dns-shop.ru/
2361
2485
  #########
2362
- - regex: '; *(AirTab)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2486
+ - regex: '; {0,2}(AirTab)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2363
2487
  device_replacement: '$1 $2'
2364
2488
  brand_replacement: 'DNS'
2365
2489
  model_replacement: '$1 $2'
@@ -2368,43 +2492,43 @@ device_parsers:
2368
2492
  # Docomo (Operator Branded Device)
2369
2493
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2370
2494
  #########
2371
- - regex: '; *(F\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2495
+ - regex: '; {0,2}(F\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2372
2496
  device_replacement: '$1'
2373
2497
  brand_replacement: 'Fujitsu'
2374
2498
  model_replacement: '$1'
2375
- - regex: '; *(HT-03A)(?: Build|\) AppleWebKit)'
2499
+ - regex: '; {0,2}(HT-03A)(?: Build|\) AppleWebKit)'
2376
2500
  device_replacement: '$1'
2377
2501
  brand_replacement: 'HTC'
2378
2502
  model_replacement: 'Magic'
2379
- - regex: '; *(HT\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2503
+ - regex: '; {0,2}(HT\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2380
2504
  device_replacement: '$1'
2381
2505
  brand_replacement: 'HTC'
2382
2506
  model_replacement: '$1'
2383
- - regex: '; *(L\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2507
+ - regex: '; {0,2}(L\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2384
2508
  device_replacement: '$1'
2385
2509
  brand_replacement: 'LG'
2386
2510
  model_replacement: '$1'
2387
- - regex: '; *(N\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2511
+ - regex: '; {0,2}(N\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2388
2512
  device_replacement: '$1'
2389
2513
  brand_replacement: 'Nec'
2390
2514
  model_replacement: '$1'
2391
- - regex: '; *(P\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2515
+ - regex: '; {0,2}(P\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2392
2516
  device_replacement: '$1'
2393
2517
  brand_replacement: 'Panasonic'
2394
2518
  model_replacement: '$1'
2395
- - regex: '; *(SC\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2519
+ - regex: '; {0,2}(SC\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2396
2520
  device_replacement: '$1'
2397
2521
  brand_replacement: 'Samsung'
2398
2522
  model_replacement: '$1'
2399
- - regex: '; *(SH\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2523
+ - regex: '; {0,2}(SH\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2400
2524
  device_replacement: '$1'
2401
2525
  brand_replacement: 'Sharp'
2402
2526
  model_replacement: '$1'
2403
- - regex: '; *(SO\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2527
+ - regex: '; {0,2}(SO\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2404
2528
  device_replacement: '$1'
2405
2529
  brand_replacement: 'SonyEricsson'
2406
2530
  model_replacement: '$1'
2407
- - regex: '; *(T\-0[12][^;/]+?)(?: Build|\) AppleWebKit)'
2531
+ - regex: '; {0,2}(T\-0[12][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2408
2532
  device_replacement: '$1'
2409
2533
  brand_replacement: 'Toshiba'
2410
2534
  model_replacement: '$1'
@@ -2413,7 +2537,7 @@ device_parsers:
2413
2537
  # DOOV
2414
2538
  # @ref: http://www.doov.com.cn/
2415
2539
  #########
2416
- - regex: '; *(DOOV)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2540
+ - regex: '; {0,2}(DOOV)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2417
2541
  device_replacement: '$1 $2'
2418
2542
  brand_replacement: 'DOOV'
2419
2543
  model_replacement: '$2'
@@ -2422,7 +2546,7 @@ device_parsers:
2422
2546
  # Enot
2423
2547
  # @ref: http://www.enot.ua/
2424
2548
  #########
2425
- - regex: '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\) AppleWebKit)'
2549
+ - regex: '; {0,2}(Enot|ENOT)[ -]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2426
2550
  device_replacement: '$1 $2'
2427
2551
  brand_replacement: 'Enot'
2428
2552
  model_replacement: '$2'
@@ -2431,11 +2555,11 @@ device_parsers:
2431
2555
  # Evercoss
2432
2556
  # @ref: http://evercoss.com/android/
2433
2557
  #########
2434
- - regex: '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2558
+ - regex: '; {0,2}[^;/]{1,100} Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2435
2559
  device_replacement: 'CROSS $1'
2436
2560
  brand_replacement: 'Evercoss'
2437
2561
  model_replacement: 'Cross $1'
2438
- - regex: '; *(CROSS|Cross)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2562
+ - regex: '; {0,2}(CROSS|Cross)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2439
2563
  device_replacement: '$1 $2'
2440
2564
  brand_replacement: 'Evercoss'
2441
2565
  model_replacement: 'Cross $2'
@@ -2444,7 +2568,7 @@ device_parsers:
2444
2568
  # Explay
2445
2569
  # @ref: http://explay.ru/
2446
2570
  #########
2447
- - regex: '; *Explay[_ ](.+?)(?:[\)]| Build)'
2571
+ - regex: '; {0,2}Explay[_ ](.{1,200}?)(?:[\)]| Build)'
2448
2572
  device_replacement: '$1'
2449
2573
  brand_replacement: 'Explay'
2450
2574
  model_replacement: '$1'
@@ -2453,11 +2577,11 @@ device_parsers:
2453
2577
  # Fly
2454
2578
  # @ref: http://www.fly-phone.com/
2455
2579
  #########
2456
- - regex: '; *(IQ.*?)(?: Build|\) AppleWebKit)'
2580
+ - regex: '; {0,2}(IQ.{0,200}?)(?: Build|\) AppleWebKit)'
2457
2581
  device_replacement: '$1'
2458
2582
  brand_replacement: 'Fly'
2459
2583
  model_replacement: '$1'
2460
- - regex: '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\d+[^;]*?);?(?: Build|\) AppleWebKit)'
2584
+ - regex: '; {0,2}(Fly|FLY)[ _](IQ[^;]{1,100}?|F[34]\d+[^;]{0,100}?);?(?: Build|\) AppleWebKit)'
2461
2585
  device_replacement: '$1 $2'
2462
2586
  brand_replacement: 'Fly'
2463
2587
  model_replacement: '$2'
@@ -2466,7 +2590,7 @@ device_parsers:
2466
2590
  # Fujitsu
2467
2591
  # @ref: http://www.fujitsu.com/global/
2468
2592
  #########
2469
- - regex: '; *(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2593
+ - regex: '; {0,2}(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2470
2594
  device_replacement: '$1'
2471
2595
  brand_replacement: 'Fujitsu'
2472
2596
  model_replacement: '$1'
@@ -2475,7 +2599,7 @@ device_parsers:
2475
2599
  # Galapad
2476
2600
  # @ref: http://www.galapad.net/product.html
2477
2601
  #########
2478
- - regex: '; *(G1)(?: Build|\) AppleWebKit)'
2602
+ - regex: '; {0,2}(G1)(?: Build|\) AppleWebKit)'
2479
2603
  device_replacement: '$1'
2480
2604
  brand_replacement: 'Galapad'
2481
2605
  model_replacement: '$1'
@@ -2484,7 +2608,7 @@ device_parsers:
2484
2608
  # Geeksphone
2485
2609
  # @ref: http://www.geeksphone.com/
2486
2610
  #########
2487
- - regex: '; *(Geeksphone) ([^;/]+?)(?: Build|\) AppleWebKit)'
2611
+ - regex: '; {0,2}(Geeksphone) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2488
2612
  device_replacement: '$1 $2'
2489
2613
  brand_replacement: '$1'
2490
2614
  model_replacement: '$2'
@@ -2493,8 +2617,7 @@ device_parsers:
2493
2617
  # Gfive
2494
2618
  # @ref: http://www.gfivemobile.com/en
2495
2619
  #########
2496
- #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
2497
- - regex: '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\) AppleWebKit)'
2620
+ - regex: '; {0,2}(G[^F]?FIVE) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2498
2621
  device_replacement: '$1 $2'
2499
2622
  brand_replacement: 'Gfive'
2500
2623
  model_replacement: '$2'
@@ -2503,16 +2626,16 @@ device_parsers:
2503
2626
  # Gionee
2504
2627
  # @ref: http://www.gionee.com/
2505
2628
  #########
2506
- - regex: '; *(Gionee)[ _\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\) AppleWebKit)'
2629
+ - regex: '; {0,2}(Gionee)[ _\-]([^;/]{1,100}?)(?:/[^;/]{1,100}|)(?: Build|\) AppleWebKit)'
2507
2630
  regex_flag: 'i'
2508
2631
  device_replacement: '$1 $2'
2509
2632
  brand_replacement: 'Gionee'
2510
2633
  model_replacement: '$2'
2511
- - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2634
+ - regex: '; {0,2}(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2512
2635
  device_replacement: 'Gionee $1'
2513
2636
  brand_replacement: 'Gionee'
2514
2637
  model_replacement: '$1'
2515
- - regex: '; *(E3) Build/JOP40D'
2638
+ - regex: '; {0,2}(E3) Build/JOP40D'
2516
2639
  device_replacement: 'Gionee $1'
2517
2640
  brand_replacement: 'Gionee'
2518
2641
  model_replacement: '$1'
@@ -2526,11 +2649,11 @@ device_parsers:
2526
2649
  # GoClever
2527
2650
  # @ref: http://www.goclever.com
2528
2651
  #########
2529
- - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB)(?: Build|\) AppleWebKit)'
2652
+ - regex: '; {0,2}((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]{0,100}|PLAYTAB)(?: Build|\) AppleWebKit)'
2530
2653
  device_replacement: 'GoClever $1'
2531
2654
  brand_replacement: 'GoClever'
2532
2655
  model_replacement: '$1'
2533
- - regex: '; *GOCLEVER ([^;/]+?)(?: Build|\) AppleWebKit)'
2656
+ - regex: '; {0,2}GOCLEVER ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2534
2657
  device_replacement: 'GoClever $1'
2535
2658
  brand_replacement: 'GoClever'
2536
2659
  model_replacement: '$1'
@@ -2539,11 +2662,11 @@ device_parsers:
2539
2662
  # Google
2540
2663
  # @ref: http://www.google.de/glass/start/
2541
2664
  #########
2542
- - regex: '; *(Glass \d+)(?: Build|\) AppleWebKit)'
2665
+ - regex: '; {0,2}(Glass \d+)(?: Build|\) AppleWebKit)'
2543
2666
  device_replacement: '$1'
2544
2667
  brand_replacement: 'Google'
2545
2668
  model_replacement: '$1'
2546
- - regex: '; *(Pixel.*?)(?: Build|\) AppleWebKit)'
2669
+ - regex: '; {0,2}(Pixel.{0,200}?)(?: Build|\) AppleWebKit)'
2547
2670
  device_replacement: '$1'
2548
2671
  brand_replacement: 'Google'
2549
2672
  model_replacement: '$1'
@@ -2552,7 +2675,7 @@ device_parsers:
2552
2675
  # Gigabyte
2553
2676
  # @ref: http://gsmart.gigabytecm.com/en/
2554
2677
  #########
2555
- - regex: '; *(GSmart)[ -]([^/]+)(?: Build|\) AppleWebKit)'
2678
+ - regex: '; {0,2}(GSmart)[ -]([^/]{1,50})(?: Build|\) AppleWebKit)'
2556
2679
  device_replacement: '$1 $2'
2557
2680
  brand_replacement: 'Gigabyte'
2558
2681
  model_replacement: '$1 $2'
@@ -2561,7 +2684,7 @@ device_parsers:
2561
2684
  # Freescale development boards
2562
2685
  # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
2563
2686
  #########
2564
- - regex: '; *(imx5[13]_[^/]+)(?: Build|\) AppleWebKit)'
2687
+ - regex: '; {0,2}(imx5[13]_[^/]{1,50})(?: Build|\) AppleWebKit)'
2565
2688
  device_replacement: 'Freescale $1'
2566
2689
  brand_replacement: 'Freescale'
2567
2690
  model_replacement: '$1'
@@ -2571,11 +2694,11 @@ device_parsers:
2571
2694
  # @ref: http://www.haier.com/
2572
2695
  # @ref: http://www.haier.com/de/produkte/tablet/
2573
2696
  #########
2574
- - regex: '; *Haier[ _\-]([^/]+)(?: Build|\) AppleWebKit)'
2697
+ - regex: '; {0,2}Haier[ _\-]([^/]{1,50})(?: Build|\) AppleWebKit)'
2575
2698
  device_replacement: 'Haier $1'
2576
2699
  brand_replacement: 'Haier'
2577
2700
  model_replacement: '$1'
2578
- - regex: '; *(PAD1016)(?: Build|\) AppleWebKit)'
2701
+ - regex: '; {0,2}(PAD1016)(?: Build|\) AppleWebKit)'
2579
2702
  device_replacement: 'Haipad $1'
2580
2703
  brand_replacement: 'Haipad'
2581
2704
  model_replacement: '$1'
@@ -2585,7 +2708,7 @@ device_parsers:
2585
2708
  # @ref: http://www.haipad.net/
2586
2709
  # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
2587
2710
  #########
2588
- - regex: '; *(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2711
+ - regex: '; {0,2}(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2589
2712
  device_replacement: 'Haipad $1'
2590
2713
  brand_replacement: 'Haipad'
2591
2714
  model_replacement: '$1'
@@ -2595,7 +2718,7 @@ device_parsers:
2595
2718
  # @ref: http://www.hannspree.eu/
2596
2719
  # @models: SN10T1|SN10T2|SN70T31B|SN70T32W
2597
2720
  #########
2598
- - regex: '; *(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2721
+ - regex: '; {0,2}(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2599
2722
  device_replacement: 'Hannspree $1'
2600
2723
  brand_replacement: 'Hannspree'
2601
2724
  model_replacement: '$1'
@@ -2604,11 +2727,11 @@ device_parsers:
2604
2727
  # HCLme
2605
2728
  # @ref: http://www.hclmetablet.com/india/
2606
2729
  #########
2607
- - regex: 'Build/HCL ME Tablet ([^;\)]+)[\);]'
2730
+ - regex: 'Build/HCL ME Tablet ([^;\)]{1,3})[\);]'
2608
2731
  device_replacement: 'HCLme $1'
2609
2732
  brand_replacement: 'HCLme'
2610
2733
  model_replacement: '$1'
2611
- - regex: '; *([^;\/]+) Build/HCL'
2734
+ - regex: '; {0,2}([^;\/]+) Build/HCL'
2612
2735
  device_replacement: 'HCLme $1'
2613
2736
  brand_replacement: 'HCLme'
2614
2737
  model_replacement: '$1'
@@ -2617,7 +2740,7 @@ device_parsers:
2617
2740
  # Hena
2618
2741
  # @ref: http://www.henadigital.com/en/product/index.asp?id=6
2619
2742
  #########
2620
- - regex: '; *(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2743
+ - regex: '; {0,2}(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2621
2744
  device_replacement: 'Hena $1'
2622
2745
  brand_replacement: 'Hena'
2623
2746
  model_replacement: '$1'
@@ -2626,11 +2749,11 @@ device_parsers:
2626
2749
  # Hisense
2627
2750
  # @ref: http://www.hisense.com/
2628
2751
  #########
2629
- - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\) AppleWebKit)'
2752
+ - regex: '; {0,2}(EG\d{2,}|HS-[^;/]{1,100}|MIRA[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2630
2753
  device_replacement: 'Hisense $1'
2631
2754
  brand_replacement: 'Hisense'
2632
2755
  model_replacement: '$1'
2633
- - regex: '; *(andromax[^;/]+?)(?: Build|\) AppleWebKit)'
2756
+ - regex: '; {0,2}(andromax[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2634
2757
  regex_flag: 'i'
2635
2758
  device_replacement: 'Hisense $1'
2636
2759
  brand_replacement: 'Hisense'
@@ -2640,7 +2763,7 @@ device_parsers:
2640
2763
  # hitech
2641
2764
  # @ref: http://www.hitech-mobiles.com/
2642
2765
  #########
2643
- - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2766
+ - regex: '; {0,2}(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2644
2767
  device_replacement: 'AMAZE $1$2'
2645
2768
  brand_replacement: 'hitech'
2646
2769
  model_replacement: 'AMAZE $1$2'
@@ -2649,15 +2772,15 @@ device_parsers:
2649
2772
  # HP
2650
2773
  # @ref: http://www.hp.com/
2651
2774
  #########
2652
- - regex: '; *(PlayBook)(?: Build|\) AppleWebKit)'
2775
+ - regex: '; {0,2}(PlayBook)(?: Build|\) AppleWebKit)'
2653
2776
  device_replacement: 'HP $1'
2654
2777
  brand_replacement: 'HP'
2655
2778
  model_replacement: '$1'
2656
- - regex: '; *HP ([^/]+)(?: Build|\) AppleWebKit)'
2779
+ - regex: '; {0,2}HP ([^/]{1,50})(?: Build|\) AppleWebKit)'
2657
2780
  device_replacement: 'HP $1'
2658
2781
  brand_replacement: 'HP'
2659
2782
  model_replacement: '$1'
2660
- - regex: '; *([^/]+_tenderloin)(?: Build|\) AppleWebKit)'
2783
+ - regex: '; {0,2}([^/]{1,30}_tenderloin)(?: Build|\) AppleWebKit)'
2661
2784
  device_replacement: 'HP TouchPad'
2662
2785
  brand_replacement: 'HP'
2663
2786
  model_replacement: 'TouchPad'
@@ -2667,62 +2790,66 @@ device_parsers:
2667
2790
  # @ref: http://www.huaweidevice.com
2668
2791
  # @note: Needs to be before HTC due to Desire HD Build on U8815
2669
2792
  #########
2670
- - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2793
+ - regex: '; {0,2}(HUAWEI |Huawei-|)([UY][^;/]{1,100}) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2671
2794
  device_replacement: '$1$2'
2672
2795
  brand_replacement: 'Huawei'
2673
2796
  model_replacement: '$2'
2674
- - 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})\)'
2675
2798
  device_replacement: '$1'
2676
2799
  brand_replacement: 'Huawei'
2677
2800
  model_replacement: '$2'
2678
- - regex: '; *(S7|M860) Build'
2801
+ - regex: '; {0,2}(S7|M860) Build'
2679
2802
  device_replacement: '$1'
2680
2803
  brand_replacement: 'Huawei'
2681
2804
  model_replacement: '$1'
2682
- - regex: '; *((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2805
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2683
2806
  device_replacement: '$1$2'
2684
2807
  brand_replacement: 'Huawei'
2685
2808
  model_replacement: '$2'
2686
- - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
2809
+ - regex: '; {0,2}((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]{1,100}) Build'
2687
2810
  device_replacement: '$1$2'
2688
2811
  brand_replacement: 'Huawei'
2689
2812
  model_replacement: '$2'
2690
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]+) Build'
2813
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]{1,100}) Build'
2691
2814
  device_replacement: '$1$2'
2692
2815
  brand_replacement: 'Huawei'
2693
2816
  model_replacement: '$2'
2694
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)([^;/]+) Build'
2817
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)([^;/]{1,100}) Build'
2695
2818
  device_replacement: '$1$2'
2696
2819
  brand_replacement: 'Huawei'
2697
2820
  model_replacement: '$2'
2698
- - regex: '; *(MediaPad[^;]+|SpringBoard) Build/Huawei'
2821
+ - regex: '; {0,2}(MediaPad[^;]{1,200}|SpringBoard) Build/Huawei'
2699
2822
  device_replacement: '$1'
2700
2823
  brand_replacement: 'Huawei'
2701
2824
  model_replacement: '$1'
2702
- - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
2825
+ - regex: '; {0,2}([^;]{1,200}) Build/(?:Huawei|HUAWEI)'
2703
2826
  device_replacement: '$1'
2704
2827
  brand_replacement: 'Huawei'
2705
2828
  model_replacement: '$1'
2706
- - regex: '; *([Uu])([89]\d{3}) Build'
2829
+ - regex: '; {0,2}([Uu])([89]\d{3}) Build'
2707
2830
  device_replacement: '$1$2'
2708
2831
  brand_replacement: 'Huawei'
2709
2832
  model_replacement: 'U$2'
2710
- - regex: '; *(?:Ideos |IDEOS )(S7) Build'
2833
+ - regex: '; {0,2}(?:Ideos |IDEOS )(S7) Build'
2711
2834
  device_replacement: 'Huawei Ideos$1'
2712
2835
  brand_replacement: 'Huawei'
2713
2836
  model_replacement: 'Ideos$1'
2714
- - regex: '; *(?:Ideos |IDEOS )([^;/]+\s*|\s*)Build'
2837
+ - regex: '; {0,2}(?:Ideos |IDEOS )([^;/]{1,50}\s{0,5}|\s{0,5})Build'
2715
2838
  device_replacement: 'Huawei Ideos$1'
2716
2839
  brand_replacement: 'Huawei'
2717
2840
  model_replacement: 'Ideos$1'
2718
- - 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[/ ]'
2719
2842
  device_replacement: 'Huawei $1'
2720
2843
  brand_replacement: 'Huawei'
2721
2844
  model_replacement: '$1'
2722
- - regex: '; *((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2845
+ - regex: '; {0,2}((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2723
2846
  device_replacement: 'Huawei $1'
2724
2847
  brand_replacement: 'Huawei'
2725
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'
2726
2853
 
2727
2854
  #########
2728
2855
  # HTC
@@ -2730,7 +2857,7 @@ device_parsers:
2730
2857
  # @ref: http://en.wikipedia.org/wiki/List_of_HTC_phones
2731
2858
  #########
2732
2859
 
2733
- - regex: '; *HTC[ _]([^;]+); Windows Phone'
2860
+ - regex: '; {0,2}HTC[ _]([^;]{1,200}); Windows Phone'
2734
2861
  device_replacement: 'HTC $1'
2735
2862
  brand_replacement: 'HTC'
2736
2863
  model_replacement: '$1'
@@ -2738,59 +2865,59 @@ device_parsers:
2738
2865
  # Android HTC with Version Number matcher
2739
2866
  # ; HTC_0P3Z11/1.12.161.3 Build
2740
2867
  # ;HTC_A3335 V2.38.841.1 Build
2741
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2868
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2742
2869
  device_replacement: 'HTC $1'
2743
2870
  brand_replacement: 'HTC'
2744
2871
  model_replacement: '$1'
2745
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2872
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2746
2873
  device_replacement: 'HTC $1 $2'
2747
2874
  brand_replacement: 'HTC'
2748
2875
  model_replacement: '$1 $2'
2749
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2876
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2750
2877
  device_replacement: 'HTC $1 $2 $3'
2751
2878
  brand_replacement: 'HTC'
2752
2879
  model_replacement: '$1 $2 $3'
2753
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2880
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2754
2881
  device_replacement: 'HTC $1 $2 $3 $4'
2755
2882
  brand_replacement: 'HTC'
2756
2883
  model_replacement: '$1 $2 $3 $4'
2757
2884
 
2758
2885
  # Android HTC without Version Number matcher
2759
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
2886
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: {0,2}Build|[;\)]| - )'
2760
2887
  device_replacement: 'HTC $1'
2761
2888
  brand_replacement: 'HTC'
2762
2889
  model_replacement: '$1'
2763
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
2890
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: {0,2}Build|[;\)]| - )'
2764
2891
  device_replacement: 'HTC $1 $2'
2765
2892
  brand_replacement: 'HTC'
2766
2893
  model_replacement: '$1 $2'
2767
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
2894
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: {0,2}Build|[;\)]| - )'
2768
2895
  device_replacement: 'HTC $1 $2 $3'
2769
2896
  brand_replacement: 'HTC'
2770
2897
  model_replacement: '$1 $2 $3'
2771
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
2898
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: {0,2}Build|[;\)]| - )'
2772
2899
  device_replacement: 'HTC $1 $2 $3 $4'
2773
2900
  brand_replacement: 'HTC'
2774
2901
  model_replacement: '$1 $2 $3 $4'
2775
2902
 
2776
2903
  # HTC Streaming Player
2777
- - regex: 'HTC Streaming Player [^\/]*/[^\/]*/ htc_([^/]+) /'
2904
+ - regex: 'HTC Streaming Player [^\/]{0,30}/[^\/]{0,10}/ htc_([^/]{1,10}) /'
2778
2905
  device_replacement: 'HTC $1'
2779
2906
  brand_replacement: 'HTC'
2780
2907
  model_replacement: '$1'
2781
2908
  # general matcher for anything else
2782
- - 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|[;/\(\)]|$)'
2783
2910
  regex_flag: 'i'
2784
2911
  device_replacement: 'HTC $1'
2785
2912
  brand_replacement: 'HTC'
2786
2913
  model_replacement: '$1'
2787
2914
  # Android matchers without HTC
2788
- - 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|[/;\(\)])'
2789
2916
  regex_flag: 'i'
2790
2917
  device_replacement: 'HTC $1'
2791
2918
  brand_replacement: 'HTC'
2792
2919
  model_replacement: '$1'
2793
- - 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)'
2794
2921
  regex_flag: 'i'
2795
2922
  device_replacement: 'HTC $1 $2'
2796
2923
  brand_replacement: 'HTC'
@@ -2800,16 +2927,16 @@ device_parsers:
2800
2927
  # Hyundai
2801
2928
  # @ref: http://www.hyundaitechnologies.com
2802
2929
  #########
2803
- - regex: '; *HYUNDAI (T\d[^/]*)(?: Build|\) AppleWebKit)'
2930
+ - regex: '; {0,2}HYUNDAI (T\d[^/]{0,10})(?: Build|\) AppleWebKit)'
2804
2931
  device_replacement: 'Hyundai $1'
2805
2932
  brand_replacement: 'Hyundai'
2806
2933
  model_replacement: '$1'
2807
- - regex: '; *HYUNDAI ([^;/]+?)(?: Build|\) AppleWebKit)'
2934
+ - regex: '; {0,2}HYUNDAI ([^;/]{1,10}?)(?: Build|\) AppleWebKit)'
2808
2935
  device_replacement: 'Hyundai $1'
2809
2936
  brand_replacement: 'Hyundai'
2810
2937
  model_replacement: '$1'
2811
2938
  # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
2812
- - regex: '; *(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2939
+ - regex: '; {0,2}(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2813
2940
  device_replacement: 'Hyundai $1'
2814
2941
  brand_replacement: 'Hyundai'
2815
2942
  model_replacement: '$1'
@@ -2818,12 +2945,12 @@ device_parsers:
2818
2945
  # iBall
2819
2946
  # @ref: http://www.iball.co.in/Category/Mobiles/22
2820
2947
  #########
2821
- - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2948
+ - regex: '; {0,2}(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2822
2949
  regex_flag: 'i'
2823
2950
  device_replacement: '$1 $2'
2824
2951
  brand_replacement: 'iBall'
2825
2952
  model_replacement: '$1 $2'
2826
- - regex: '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\) AppleWebKit)'
2953
+ - regex: '; {0,2}(IBall)(?:[ _]([^;/]{1,100}?)|)(?: Build|\) AppleWebKit)'
2827
2954
  regex_flag: 'i'
2828
2955
  device_replacement: '$1 $2'
2829
2956
  brand_replacement: 'iBall'
@@ -2833,7 +2960,7 @@ device_parsers:
2833
2960
  # IconBIT
2834
2961
  # @ref: http://www.iconbit.com/catalog/tablets/
2835
2962
  #########
2836
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\) AppleWebKit)'
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)'
2837
2964
  device_replacement: '$1'
2838
2965
  brand_replacement: 'IconBIT'
2839
2966
  model_replacement: '$1'
@@ -2842,7 +2969,7 @@ device_parsers:
2842
2969
  # IMO
2843
2970
  # @ref: http://www.ponselimo.com/
2844
2971
  #########
2845
- - regex: '; *(IMO)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2972
+ - regex: '; {0,2}(IMO)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2846
2973
  regex_flag: 'i'
2847
2974
  device_replacement: '$1 $2'
2848
2975
  brand_replacement: 'IMO'
@@ -2852,12 +2979,12 @@ device_parsers:
2852
2979
  # i-mobile
2853
2980
  # @ref: http://www.i-mobilephone.com/
2854
2981
  #########
2855
- - regex: '; *i-?mobile[ _]([^/]+)(?: Build|\) AppleWebKit)'
2982
+ - regex: '; {0,2}i-?mobile[ _]([^/]{1,50})(?: Build|\) AppleWebKit)'
2856
2983
  regex_flag: 'i'
2857
2984
  device_replacement: 'i-mobile $1'
2858
2985
  brand_replacement: 'imobile'
2859
2986
  model_replacement: '$1'
2860
- - regex: '; *(i-(?:style|note)[^/]*)(?: Build|\) AppleWebKit)'
2987
+ - regex: '; {0,2}(i-(?:style|note)[^/]{0,10})(?: Build|\) AppleWebKit)'
2861
2988
  regex_flag: 'i'
2862
2989
  device_replacement: 'i-mobile $1'
2863
2990
  brand_replacement: 'imobile'
@@ -2867,7 +2994,7 @@ device_parsers:
2867
2994
  # Impression
2868
2995
  # @ref: http://impression.ua/planshetnye-kompyutery
2869
2996
  #########
2870
- - regex: '; *(ImPAD) ?(\d+(?:.)*?)(?: Build|\) AppleWebKit)'
2997
+ - regex: '; {0,2}(ImPAD) ?(\d+(?:.){0,100}?)(?: Build|\) AppleWebKit)'
2871
2998
  device_replacement: '$1 $2'
2872
2999
  brand_replacement: 'Impression'
2873
3000
  model_replacement: '$1 $2'
@@ -2876,7 +3003,7 @@ device_parsers:
2876
3003
  # Infinix
2877
3004
  # @ref: http://www.infinixmobility.com/index.html
2878
3005
  #########
2879
- - regex: '; *(Infinix)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3006
+ - regex: '; {0,2}(Infinix)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2880
3007
  device_replacement: '$1 $2'
2881
3008
  brand_replacement: 'Infinix'
2882
3009
  model_replacement: '$2'
@@ -2885,7 +3012,7 @@ device_parsers:
2885
3012
  # Informer
2886
3013
  # @ref: ??
2887
3014
  #########
2888
- - regex: '; *(Informer)[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
3015
+ - regex: '; {0,2}(Informer)[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2889
3016
  device_replacement: '$1 $2'
2890
3017
  brand_replacement: 'Informer'
2891
3018
  model_replacement: '$2'
@@ -2895,7 +3022,7 @@ device_parsers:
2895
3022
  # @ref: http://www.intenso.de
2896
3023
  # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
2897
3024
  #########
2898
- - regex: '; *(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
3025
+ - regex: '; {0,2}(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
2899
3026
  device_replacement: 'Intenso $1'
2900
3027
  brand_replacement: 'Intenso'
2901
3028
  model_replacement: '$1 $2'
@@ -2906,21 +3033,21 @@ device_parsers:
2906
3033
  # @note: Zync also offers a "Cloud Z5" device
2907
3034
  #########
2908
3035
  # smartphones
2909
- - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+?) *(?:Build|;)'
3036
+ - regex: '; {0,2}(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]{1,100}?) {0,2}(?:Build|;)'
2910
3037
  device_replacement: '$1$2$3'
2911
3038
  brand_replacement: 'Intex'
2912
3039
  model_replacement: '$1 $3'
2913
3040
  # matches "INTEX CLOUD X1"
2914
- - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
3041
+ - regex: '; {0,2}(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) {0,2}(?:Build|;)'
2915
3042
  device_replacement: '$1 $2'
2916
3043
  brand_replacement: 'Intex'
2917
3044
  model_replacement: '$1 $2'
2918
3045
  # tablets
2919
- - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
3046
+ - regex: '; {0,2}([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]{0,50}) {0,2}(?:Build|;)'
2920
3047
  device_replacement: '$1 $2 $3'
2921
3048
  brand_replacement: 'Intex'
2922
3049
  model_replacement: 'iBuddy $2 $3'
2923
- - regex: '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)'
3050
+ - regex: '; {0,2}(I-Buddy)[ _]([^;/]{1,100}?) {0,2}(?:Build|;)'
2924
3051
  device_replacement: '$1 $2'
2925
3052
  brand_replacement: 'Intex'
2926
3053
  model_replacement: 'iBuddy $2'
@@ -2929,7 +3056,7 @@ device_parsers:
2929
3056
  # iOCEAN
2930
3057
  # @ref: http://www.iocean.cc/
2931
3058
  #########
2932
- - regex: '; *(iOCEAN) ([^/]+)(?: Build|\) AppleWebKit)'
3059
+ - regex: '; {0,2}(iOCEAN) ([^/]{1,50})(?: Build|\) AppleWebKit)'
2933
3060
  regex_flag: 'i'
2934
3061
  device_replacement: '$1 $2'
2935
3062
  brand_replacement: 'iOCEAN'
@@ -2939,7 +3066,7 @@ device_parsers:
2939
3066
  # i.onik
2940
3067
  # @ref: http://www.i-onik.de/
2941
3068
  #########
2942
- - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
3069
+ - regex: '; {0,2}(TP\d+(?:\.\d+|)\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2943
3070
  device_replacement: 'ionik $1'
2944
3071
  brand_replacement: 'ionik'
2945
3072
  model_replacement: '$1'
@@ -2948,7 +3075,7 @@ device_parsers:
2948
3075
  # IRU.ru
2949
3076
  # @ref: http://www.iru.ru/catalog/soho/planetable/
2950
3077
  #########
2951
- - regex: '; *(M702pro)(?: Build|\) AppleWebKit)'
3078
+ - regex: '; {0,2}(M702pro)(?: Build|\) AppleWebKit)'
2952
3079
  device_replacement: '$1'
2953
3080
  brand_replacement: 'Iru'
2954
3081
  model_replacement: '$1'
@@ -2957,7 +3084,7 @@ device_parsers:
2957
3084
  # Itel Mobile
2958
3085
  # @ref: https://www.itel-mobile.com/global/products/
2959
3086
  #########
2960
- - regex: '; *itel ([^;/]*)(?: Build|\) AppleWebKit)'
3087
+ - regex: '; {0,2}itel ([^;/]*)(?: Build|\) AppleWebKit)'
2961
3088
  device_replacement: 'Itel $1'
2962
3089
  brand_replacement: 'Itel'
2963
3090
  model_replacement: '$1'
@@ -2967,11 +3094,11 @@ device_parsers:
2967
3094
  # @ref: http://www.ivio.com/mobile.php
2968
3095
  # @models: DG80,DG20,DE38,DE88,MD70
2969
3096
  #########
2970
- - regex: '; *(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
3097
+ - regex: '; {0,2}(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
2971
3098
  device_replacement: '$1'
2972
3099
  brand_replacement: 'Ivio'
2973
3100
  model_replacement: '$1'
2974
- - regex: '; *IVIO[_\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3101
+ - regex: '; {0,2}IVIO[_\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2975
3102
  device_replacement: '$1'
2976
3103
  brand_replacement: 'Ivio'
2977
3104
  model_replacement: '$1'
@@ -2980,7 +3107,7 @@ device_parsers:
2980
3107
  # Jaytech
2981
3108
  # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
2982
3109
  #########
2983
- - regex: '; *(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
3110
+ - regex: '; {0,2}(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
2984
3111
  device_replacement: '$1'
2985
3112
  brand_replacement: 'Jaytech'
2986
3113
  model_replacement: '$1'
@@ -2989,7 +3116,7 @@ device_parsers:
2989
3116
  # Jiayu
2990
3117
  # @ref: http://www.ejiayu.com/en/Product.html
2991
3118
  #########
2992
- - regex: '; *(JY-[^;/]+|G[234]S?)(?: Build|\) AppleWebKit)'
3119
+ - regex: '; {0,2}(JY-[^;/]{1,100}|G[234]S?)(?: Build|\) AppleWebKit)'
2993
3120
  device_replacement: '$1'
2994
3121
  brand_replacement: 'Jiayu'
2995
3122
  model_replacement: '$1'
@@ -2998,7 +3125,7 @@ device_parsers:
2998
3125
  # JXD
2999
3126
  # @ref: http://www.jxd.hk/
3000
3127
  #########
3001
- - regex: '; *(JXD)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3128
+ - regex: '; {0,2}(JXD)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3002
3129
  device_replacement: '$1 $2'
3003
3130
  brand_replacement: 'JXD'
3004
3131
  model_replacement: '$2'
@@ -3007,16 +3134,16 @@ device_parsers:
3007
3134
  # Karbonn
3008
3135
  # @ref: http://www.karbonnmobiles.com/products_tablet.php
3009
3136
  #########
3010
- - regex: '; *Karbonn[ _]?([^;/]+) *(?:Build|;)'
3137
+ - regex: '; {0,2}Karbonn[ _]?([^;/]{1,100}) {0,2}(?:Build|;)'
3011
3138
  regex_flag: 'i'
3012
3139
  device_replacement: '$1'
3013
3140
  brand_replacement: 'Karbonn'
3014
3141
  model_replacement: '$1'
3015
- - regex: '; *([^;]+) Build/Karbonn'
3142
+ - regex: '; {0,2}([^;]{1,200}) Build/Karbonn'
3016
3143
  device_replacement: '$1'
3017
3144
  brand_replacement: 'Karbonn'
3018
3145
  model_replacement: '$1'
3019
- - 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'
3020
3147
  device_replacement: '$1'
3021
3148
  brand_replacement: 'Karbonn'
3022
3149
  model_replacement: '$1'
@@ -3025,84 +3152,84 @@ device_parsers:
3025
3152
  # KDDI (Operator Branded Device)
3026
3153
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
3027
3154
  #########
3028
- - regex: '; *(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
3155
+ - regex: '; {0,2}(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
3029
3156
  device_replacement: '$1'
3030
3157
  brand_replacement: 'Sharp'
3031
3158
  model_replacement: '$1'
3032
- - regex: '; *(IS04)(?: Build|\) AppleWebKit)'
3159
+ - regex: '; {0,2}(IS04)(?: Build|\) AppleWebKit)'
3033
3160
  device_replacement: '$1'
3034
3161
  brand_replacement: 'Regza'
3035
3162
  model_replacement: '$1'
3036
- - regex: '; *(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
3163
+ - regex: '; {0,2}(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
3037
3164
  device_replacement: '$1'
3038
3165
  brand_replacement: 'Pantech'
3039
3166
  model_replacement: '$1'
3040
- - regex: '; *(IS11S)(?: Build|\) AppleWebKit)'
3167
+ - regex: '; {0,2}(IS11S)(?: Build|\) AppleWebKit)'
3041
3168
  device_replacement: '$1'
3042
3169
  brand_replacement: 'SonyEricsson'
3043
3170
  model_replacement: 'Xperia Acro'
3044
- - regex: '; *(IS11CA)(?: Build|\) AppleWebKit)'
3171
+ - regex: '; {0,2}(IS11CA)(?: Build|\) AppleWebKit)'
3045
3172
  device_replacement: '$1'
3046
3173
  brand_replacement: 'Casio'
3047
3174
  model_replacement: 'GzOne $1'
3048
- - regex: '; *(IS11LG)(?: Build|\) AppleWebKit)'
3175
+ - regex: '; {0,2}(IS11LG)(?: Build|\) AppleWebKit)'
3049
3176
  device_replacement: '$1'
3050
3177
  brand_replacement: 'LG'
3051
3178
  model_replacement: 'Optimus X'
3052
- - regex: '; *(IS11N)(?: Build|\) AppleWebKit)'
3179
+ - regex: '; {0,2}(IS11N)(?: Build|\) AppleWebKit)'
3053
3180
  device_replacement: '$1'
3054
3181
  brand_replacement: 'Medias'
3055
3182
  model_replacement: '$1'
3056
- - regex: '; *(IS11PT)(?: Build|\) AppleWebKit)'
3183
+ - regex: '; {0,2}(IS11PT)(?: Build|\) AppleWebKit)'
3057
3184
  device_replacement: '$1'
3058
3185
  brand_replacement: 'Pantech'
3059
3186
  model_replacement: 'MIRACH'
3060
- - regex: '; *(IS12F)(?: Build|\) AppleWebKit)'
3187
+ - regex: '; {0,2}(IS12F)(?: Build|\) AppleWebKit)'
3061
3188
  device_replacement: '$1'
3062
3189
  brand_replacement: 'Fujitsu'
3063
3190
  model_replacement: 'Arrows ES'
3064
3191
  # @ref: https://ja.wikipedia.org/wiki/IS12M
3065
- - regex: '; *(IS12M)(?: Build|\) AppleWebKit)'
3192
+ - regex: '; {0,2}(IS12M)(?: Build|\) AppleWebKit)'
3066
3193
  device_replacement: '$1'
3067
3194
  brand_replacement: 'Motorola'
3068
3195
  model_replacement: 'XT909'
3069
- - regex: '; *(IS12S)(?: Build|\) AppleWebKit)'
3196
+ - regex: '; {0,2}(IS12S)(?: Build|\) AppleWebKit)'
3070
3197
  device_replacement: '$1'
3071
3198
  brand_replacement: 'SonyEricsson'
3072
3199
  model_replacement: 'Xperia Acro HD'
3073
- - regex: '; *(ISW11F)(?: Build|\) AppleWebKit)'
3200
+ - regex: '; {0,2}(ISW11F)(?: Build|\) AppleWebKit)'
3074
3201
  device_replacement: '$1'
3075
3202
  brand_replacement: 'Fujitsu'
3076
3203
  model_replacement: 'Arrowz Z'
3077
- - regex: '; *(ISW11HT)(?: Build|\) AppleWebKit)'
3204
+ - regex: '; {0,2}(ISW11HT)(?: Build|\) AppleWebKit)'
3078
3205
  device_replacement: '$1'
3079
3206
  brand_replacement: 'HTC'
3080
3207
  model_replacement: 'EVO'
3081
- - regex: '; *(ISW11K)(?: Build|\) AppleWebKit)'
3208
+ - regex: '; {0,2}(ISW11K)(?: Build|\) AppleWebKit)'
3082
3209
  device_replacement: '$1'
3083
3210
  brand_replacement: 'Kyocera'
3084
3211
  model_replacement: 'DIGNO'
3085
- - regex: '; *(ISW11M)(?: Build|\) AppleWebKit)'
3212
+ - regex: '; {0,2}(ISW11M)(?: Build|\) AppleWebKit)'
3086
3213
  device_replacement: '$1'
3087
3214
  brand_replacement: 'Motorola'
3088
3215
  model_replacement: 'Photon'
3089
- - regex: '; *(ISW11SC)(?: Build|\) AppleWebKit)'
3216
+ - regex: '; {0,2}(ISW11SC)(?: Build|\) AppleWebKit)'
3090
3217
  device_replacement: '$1'
3091
3218
  brand_replacement: 'Samsung'
3092
3219
  model_replacement: 'GALAXY S II WiMAX'
3093
- - regex: '; *(ISW12HT)(?: Build|\) AppleWebKit)'
3220
+ - regex: '; {0,2}(ISW12HT)(?: Build|\) AppleWebKit)'
3094
3221
  device_replacement: '$1'
3095
3222
  brand_replacement: 'HTC'
3096
3223
  model_replacement: 'EVO 3D'
3097
- - regex: '; *(ISW13HT)(?: Build|\) AppleWebKit)'
3224
+ - regex: '; {0,2}(ISW13HT)(?: Build|\) AppleWebKit)'
3098
3225
  device_replacement: '$1'
3099
3226
  brand_replacement: 'HTC'
3100
3227
  model_replacement: 'J'
3101
- - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3228
+ - regex: '; {0,2}(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3102
3229
  device_replacement: '$1'
3103
3230
  brand_replacement: 'KDDI'
3104
3231
  model_replacement: '$1'
3105
- - regex: '; *(INFOBAR [^;/]+?)(?: Build|\) AppleWebKit)'
3232
+ - regex: '; {0,2}(INFOBAR [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3106
3233
  device_replacement: '$1'
3107
3234
  brand_replacement: 'KDDI'
3108
3235
  model_replacement: '$1'
@@ -3111,7 +3238,7 @@ device_parsers:
3111
3238
  # Kingcom
3112
3239
  # @ref: http://www.e-kingcom.com
3113
3240
  #########
3114
- - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3241
+ - regex: '; {0,2}(JOYPAD|Joypad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3115
3242
  device_replacement: '$1 $2'
3116
3243
  brand_replacement: 'Kingcom'
3117
3244
  model_replacement: '$1 $2'
@@ -3121,7 +3248,7 @@ device_parsers:
3121
3248
  # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
3122
3249
  # @ref: http://www.kobo.com/devices#tablets
3123
3250
  #########
3124
- - regex: '; *(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3251
+ - regex: '; {0,2}(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3125
3252
  regex_flag: 'i'
3126
3253
  device_replacement: '$1'
3127
3254
  brand_replacement: 'Kobo'
@@ -3135,7 +3262,7 @@ device_parsers:
3135
3262
  # K-Touch
3136
3263
  # @ref: ??
3137
3264
  #########
3138
- - regex: '; *(K-Touch)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3265
+ - regex: '; {0,2}(K-Touch)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3139
3266
  regex_flag: 'i'
3140
3267
  device_replacement: '$1 $2'
3141
3268
  brand_replacement: 'Ktouch'
@@ -3145,7 +3272,7 @@ device_parsers:
3145
3272
  # KT Tech
3146
3273
  # @ref: http://www.kttech.co.kr
3147
3274
  #########
3148
- - regex: '; *((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3275
+ - regex: '; {0,2}((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3149
3276
  regex_flag: 'i'
3150
3277
  device_replacement: '$1'
3151
3278
  brand_replacement: 'KTtech'
@@ -3155,7 +3282,7 @@ device_parsers:
3155
3282
  # Kyocera
3156
3283
  # @ref: http://www.android.com/devices/?country=all&m=kyocera
3157
3284
  #########
3158
- - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
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)'
3159
3286
  device_replacement: '$1'
3160
3287
  brand_replacement: 'Kyocera'
3161
3288
  model_replacement: '$1'
@@ -3164,12 +3291,12 @@ device_parsers:
3164
3291
  # Lava
3165
3292
  # @ref: http://www.lavamobiles.com/
3166
3293
  #########
3167
- - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
3294
+ - regex: '; {0,2}(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
3168
3295
  regex_flag: 'i'
3169
3296
  device_replacement: 'Iris $1'
3170
3297
  brand_replacement: 'Lava'
3171
3298
  model_replacement: 'Iris $1'
3172
- - regex: '; *LAVA[ _]([^;/]+) Build'
3299
+ - regex: '; {0,2}LAVA[ _]([^;/]{1,100}) Build'
3173
3300
  device_replacement: '$1'
3174
3301
  brand_replacement: 'Lava'
3175
3302
  model_replacement: '$1'
@@ -3178,7 +3305,7 @@ device_parsers:
3178
3305
  # Lemon
3179
3306
  # @ref: http://www.lemonmobiles.com/products.php?type=1
3180
3307
  #########
3181
- - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\) AppleWebKit)'
3308
+ - regex: '; {0,2}(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]{1,100}))_?(?: Build|\) AppleWebKit)'
3182
3309
  device_replacement: 'Lemon $1$2'
3183
3310
  brand_replacement: 'Lemon'
3184
3311
  model_replacement: '$1$2'
@@ -3187,11 +3314,11 @@ device_parsers:
3187
3314
  # Lenco
3188
3315
  # @ref: http://www.lenco.com/c/tablets/
3189
3316
  #########
3190
- - regex: '; *(TAB-1012)(?: Build|\) AppleWebKit)'
3317
+ - regex: '; {0,2}(TAB-1012)(?: Build|\) AppleWebKit)'
3191
3318
  device_replacement: 'Lenco $1'
3192
3319
  brand_replacement: 'Lenco'
3193
3320
  model_replacement: '$1'
3194
- - regex: '; Lenco ([^;/]+?)(?: Build|\) AppleWebKit)'
3321
+ - regex: '; Lenco ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3195
3322
  device_replacement: 'Lenco $1'
3196
3323
  brand_replacement: 'Lenco'
3197
3324
  model_replacement: '$1'
@@ -3200,23 +3327,23 @@ device_parsers:
3200
3327
  # Lenovo
3201
3328
  # @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
3202
3329
  #########
3203
- - regex: '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3330
+ - regex: '; {0,2}(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3204
3331
  device_replacement: '$1'
3205
3332
  brand_replacement: 'Lenovo'
3206
3333
  model_replacement: '$1'
3207
- - regex: '; *(Idea[Tp]ab)[ _]([^;/]+);? Build'
3334
+ - regex: '; {0,2}(Idea[Tp]ab)[ _]([^;/]{1,100});? Build'
3208
3335
  device_replacement: 'Lenovo $1 $2'
3209
3336
  brand_replacement: 'Lenovo'
3210
3337
  model_replacement: '$1 $2'
3211
- - regex: '; *(Idea(?:Tab|pad)) ?([^;/]+) Build'
3338
+ - regex: '; {0,2}(Idea(?:Tab|pad)) ?([^;/]{1,100}) Build'
3212
3339
  device_replacement: 'Lenovo $1 $2'
3213
3340
  brand_replacement: 'Lenovo'
3214
3341
  model_replacement: '$1 $2'
3215
- - regex: '; *(ThinkPad) ?(Tablet) Build/'
3342
+ - regex: '; {0,2}(ThinkPad) ?(Tablet) Build/'
3216
3343
  device_replacement: 'Lenovo $1 $2'
3217
3344
  brand_replacement: 'Lenovo'
3218
3345
  model_replacement: '$1 $2'
3219
- - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
3346
+ - regex: '; {0,2}(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.{1,200}?)(?:Build|[;/\)])'
3220
3347
  device_replacement: 'Lenovo $1'
3221
3348
  brand_replacement: 'Lenovo'
3222
3349
  model_replacement: '$1'
@@ -3224,11 +3351,11 @@ device_parsers:
3224
3351
  device_replacement: 'Lenovo $1 $2 $3'
3225
3352
  brand_replacement: 'Lenovo'
3226
3353
  model_replacement: '$1 $2 $3'
3227
- - regex: '; *(?:Ideapad |)K1 Build/'
3354
+ - regex: '; {0,2}(?:Ideapad |)K1 Build/'
3228
3355
  device_replacement: 'Lenovo Ideapad K1'
3229
3356
  brand_replacement: 'Lenovo'
3230
3357
  model_replacement: 'Ideapad K1'
3231
- - regex: '; *(3GC101|3GW10[01]|A390) Build/'
3358
+ - regex: '; {0,2}(3GC101|3GW10[01]|A390) Build/'
3232
3359
  device_replacement: '$1'
3233
3360
  brand_replacement: 'Lenovo'
3234
3361
  model_replacement: '$1'
@@ -3241,7 +3368,7 @@ device_parsers:
3241
3368
  # Lexibook
3242
3369
  # @ref: http://www.lexibook.com/fr
3243
3370
  #########
3244
- - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3371
+ - regex: '; {0,2}(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3245
3372
  device_replacement: '$1$2'
3246
3373
  brand_replacement: 'Lexibook'
3247
3374
  model_replacement: '$1$2'
@@ -3250,23 +3377,23 @@ device_parsers:
3250
3377
  # LG
3251
3378
  # @ref: http://www.lg.com/uk/mobile
3252
3379
  #########
3253
- - 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|;)'
3254
3381
  device_replacement: '$1'
3255
3382
  brand_replacement: 'LG'
3256
3383
  model_replacement: '$1'
3257
- - 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|[;\)])'
3258
3385
  device_replacement: '$1'
3259
3386
  brand_replacement: 'LG'
3260
3387
  model_replacement: '$1'
3261
- - 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+|[,;/\)\(]|$)'
3262
3389
  device_replacement: '$1$2'
3263
3390
  brand_replacement: 'LG'
3264
3391
  model_replacement: '$2'
3265
- - regex: '; *(LG[ \-]|LG)([^;/]+)[;/]? Build'
3392
+ - regex: '; {0,2}(LG[ \-]|LG)([^;/]{1,100})[;/]? Build'
3266
3393
  device_replacement: '$1$2'
3267
3394
  brand_replacement: 'LG'
3268
3395
  model_replacement: '$2'
3269
- - regex: '^(LG)-([^;/]+)/ Mozilla/.*; Android'
3396
+ - regex: '^(LG)-([^;/]{1,100})/ Mozilla/.{0,200}; Android'
3270
3397
  device_replacement: '$1 $2'
3271
3398
  brand_replacement: 'LG'
3272
3399
  model_replacement: '$2'
@@ -3279,11 +3406,11 @@ device_parsers:
3279
3406
  # Malata
3280
3407
  # @ref: http://www.malata.com/en/products.aspx?classid=680
3281
3408
  #########
3282
- - regex: '; *((?:SMB|smb)[^;/]+?)(?: Build|\) AppleWebKit)'
3409
+ - regex: '; {0,2}((?:SMB|smb)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3283
3410
  device_replacement: '$1'
3284
3411
  brand_replacement: 'Malata'
3285
3412
  model_replacement: '$1'
3286
- - regex: '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\) AppleWebKit)'
3413
+ - regex: '; {0,2}(?:Malata|MALATA) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3287
3414
  device_replacement: '$1'
3288
3415
  brand_replacement: 'Malata'
3289
3416
  model_replacement: '$1'
@@ -3292,7 +3419,7 @@ device_parsers:
3292
3419
  # Manta
3293
3420
  # @ref: http://www.manta.com.pl/en
3294
3421
  #########
3295
- - regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
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)'
3296
3423
  device_replacement: '$1'
3297
3424
  brand_replacement: 'Manta'
3298
3425
  model_replacement: '$1'
@@ -3301,7 +3428,7 @@ device_parsers:
3301
3428
  # Match
3302
3429
  # @ref: http://www.match.net.cn/products.asp
3303
3430
  #########
3304
- - 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|\) AppleWebKit)'
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)'
3305
3432
  device_replacement: '$1'
3306
3433
  brand_replacement: 'Match'
3307
3434
  model_replacement: '$1'
@@ -3315,7 +3442,7 @@ device_parsers:
3315
3442
  # Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
3316
3443
  # @note: Need more User-Agents!!!
3317
3444
  #########
3318
- - regex: '; *(GenxDroid7|MSD7.*?|AX\d.*?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3445
+ - regex: '; {0,2}(GenxDroid7|MSD7.{0,200}?|AX\d.{0,200}?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3319
3446
  device_replacement: 'Maxx $1'
3320
3447
  brand_replacement: 'Maxx'
3321
3448
  model_replacement: '$1'
@@ -3324,11 +3451,11 @@ device_parsers:
3324
3451
  # Mediacom
3325
3452
  # @ref: http://www.mediacomeurope.it/
3326
3453
  #########
3327
- - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3454
+ - regex: '; {0,2}(M-PP[^;/]{1,30}|PhonePad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3328
3455
  device_replacement: 'Mediacom $1'
3329
3456
  brand_replacement: 'Mediacom'
3330
3457
  model_replacement: '$1'
3331
- - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3458
+ - regex: '; {0,2}(M-MP[^;/]{1,30}|SmartPad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3332
3459
  device_replacement: 'Mediacom $1'
3333
3460
  brand_replacement: 'Mediacom'
3334
3461
  model_replacement: '$1'
@@ -3337,12 +3464,12 @@ device_parsers:
3337
3464
  # Medion
3338
3465
  # @ref: http://www.medion.com/en/
3339
3466
  #########
3340
- - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3467
+ - regex: '; {0,2}(?:MD_|)LIFETAB[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3341
3468
  regex_flag: 'i'
3342
3469
  device_replacement: 'Medion Lifetab $1'
3343
3470
  brand_replacement: 'Medion'
3344
3471
  model_replacement: 'Lifetab $1'
3345
- - regex: '; *MEDION ([^;/]+?)(?: Build|\) AppleWebKit)'
3472
+ - regex: '; {0,2}MEDION ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3346
3473
  device_replacement: 'Medion $1'
3347
3474
  brand_replacement: 'Medion'
3348
3475
  model_replacement: '$1'
@@ -3351,11 +3478,11 @@ device_parsers:
3351
3478
  # Meizu
3352
3479
  # @ref: http://www.meizu.com
3353
3480
  #########
3354
- - regex: '; *(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3481
+ - regex: '; {0,2}(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3355
3482
  device_replacement: 'Meizu $1'
3356
3483
  brand_replacement: 'Meizu'
3357
3484
  model_replacement: '$1'
3358
- - regex: '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\)])'
3485
+ - regex: '; {0,2}(?:meizu_|MEIZU )(.{1,200}?) {0,2}(?:Build|[;\)])'
3359
3486
  device_replacement: 'Meizu $1'
3360
3487
  brand_replacement: 'Meizu'
3361
3488
  model_replacement: '$1'
@@ -3364,28 +3491,28 @@ device_parsers:
3364
3491
  # Micromax
3365
3492
  # @ref: http://www.micromaxinfo.com
3366
3493
  #########
3367
- - regex: '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3494
+ - regex: '; {0,2}(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3368
3495
  regex_flag: 'i'
3369
3496
  device_replacement: 'Micromax $1$2'
3370
3497
  brand_replacement: 'Micromax'
3371
3498
  model_replacement: '$1$2'
3372
- - regex: '; *Micromax[ _](A\d{2,3}[^;/]*) Build'
3499
+ - regex: '; {0,2}Micromax[ _](A\d{2,3}[^;/]*) Build'
3373
3500
  regex_flag: 'i'
3374
3501
  device_replacement: 'Micromax $1'
3375
3502
  brand_replacement: 'Micromax'
3376
3503
  model_replacement: '$1'
3377
3504
  # be carefull here with Acer e.g. A500
3378
- - 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'
3379
3506
  regex_flag: 'i'
3380
3507
  device_replacement: 'Micromax $1'
3381
3508
  brand_replacement: 'Micromax'
3382
3509
  model_replacement: '$1'
3383
- - regex: '; *Micromax[ _](P\d{3}[^;/]*) Build'
3510
+ - regex: '; {0,2}Micromax[ _](P\d{3}[^;/]*) Build'
3384
3511
  regex_flag: 'i'
3385
3512
  device_replacement: 'Micromax $1'
3386
3513
  brand_replacement: 'Micromax'
3387
3514
  model_replacement: '$1'
3388
- - regex: '; *(P\d{3}|P\d{3}\(Funbook\)) Build'
3515
+ - regex: '; {0,2}(P\d{3}|P\d{3}\(Funbook\)) Build'
3389
3516
  regex_flag: 'i'
3390
3517
  device_replacement: 'Micromax $1'
3391
3518
  brand_replacement: 'Micromax'
@@ -3395,7 +3522,7 @@ device_parsers:
3395
3522
  # Mito
3396
3523
  # @ref: http://new.mitomobile.com/
3397
3524
  #########
3398
- - regex: '; *(MITO)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
3525
+ - regex: '; {0,2}(MITO)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3399
3526
  regex_flag: 'i'
3400
3527
  device_replacement: '$1 $2'
3401
3528
  brand_replacement: 'Mito'
@@ -3405,7 +3532,7 @@ device_parsers:
3405
3532
  # Mobistel
3406
3533
  # @ref: http://www.mobistel.com/
3407
3534
  #########
3408
- - regex: '; *(Cynus)[ _](F5|T\d|.+?) *(?:Build|[;/\)])'
3535
+ - regex: '; {0,2}(Cynus)[ _](F5|T\d|.{1,200}?) {0,2}(?:Build|[;/\)])'
3409
3536
  regex_flag: 'i'
3410
3537
  device_replacement: '$1 $2'
3411
3538
  brand_replacement: 'Mobistel'
@@ -3415,12 +3542,12 @@ device_parsers:
3415
3542
  # Modecom
3416
3543
  # @ref: http://www.modecom.eu/tablets/portal/
3417
3544
  #########
3418
- - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\) AppleWebKit)'
3545
+ - regex: '; {0,2}(MODECOM |)(FreeTab) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3419
3546
  regex_flag: 'i'
3420
3547
  device_replacement: '$1$2 $3'
3421
3548
  brand_replacement: 'Modecom'
3422
3549
  model_replacement: '$2 $3'
3423
- - regex: '; *(MODECOM )([^;/]+?)(?: Build|\) AppleWebKit)'
3550
+ - regex: '; {0,2}(MODECOM )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3424
3551
  regex_flag: 'i'
3425
3552
  device_replacement: '$1 $2'
3426
3553
  brand_replacement: 'Modecom'
@@ -3430,32 +3557,32 @@ device_parsers:
3430
3557
  # Motorola
3431
3558
  # @ref: http://www.motorola.com/us/shop-all-mobile-phones/
3432
3559
  #########
3433
- - 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'
3434
3561
  device_replacement: 'Motorola $1'
3435
3562
  brand_replacement: 'Motorola'
3436
3563
  model_replacement: '$1'
3437
- - regex: '; *(Milestone )(XT[^;/]*) Build'
3564
+ - regex: '; {0,2}(Milestone )(XT[^;/]*) Build'
3438
3565
  device_replacement: 'Motorola $1$2'
3439
3566
  brand_replacement: 'Motorola'
3440
3567
  model_replacement: '$2'
3441
- - regex: '; *(Motoroi ?x|Droid X|DROIDX) Build'
3568
+ - regex: '; {0,2}(Motoroi ?x|Droid X|DROIDX) Build'
3442
3569
  regex_flag: 'i'
3443
3570
  device_replacement: 'Motorola $1'
3444
3571
  brand_replacement: 'Motorola'
3445
3572
  model_replacement: 'DROID X'
3446
- - regex: '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3573
+ - regex: '; {0,2}(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3447
3574
  device_replacement: 'Motorola $1'
3448
3575
  brand_replacement: 'Motorola'
3449
3576
  model_replacement: '$1'
3450
- - 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'
3451
3578
  device_replacement: '$1'
3452
3579
  brand_replacement: 'Motorola'
3453
3580
  model_replacement: '$1'
3454
- - regex: '; *(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]+) Build'
3581
+ - regex: '; {0,2}(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]{1,100}) Build'
3455
3582
  device_replacement: '$1$2'
3456
3583
  brand_replacement: 'Motorola'
3457
3584
  model_replacement: '$2'
3458
- - regex: '; *(Moto[_ ]?|MOT\-)([^;/]+) Build'
3585
+ - regex: '; {0,2}(Moto[_ ]?|MOT\-)([^;/]{1,100}) Build'
3459
3586
  device_replacement: '$1$2'
3460
3587
  brand_replacement: 'Motorola'
3461
3588
  model_replacement: '$2'
@@ -3464,7 +3591,7 @@ device_parsers:
3464
3591
  # MpMan
3465
3592
  # @ref: http://www.mpmaneurope.com
3466
3593
  #########
3467
- - 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|\) AppleWebKit)'
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)'
3468
3595
  device_replacement: '$1'
3469
3596
  brand_replacement: 'Mpman'
3470
3597
  model_replacement: '$1'
@@ -3473,7 +3600,7 @@ device_parsers:
3473
3600
  # MSI
3474
3601
  # @ref: http://www.msi.com/product/windpad/
3475
3602
  #########
3476
- - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
3603
+ - regex: '; {0,2}(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3477
3604
  regex_flag: 'i'
3478
3605
  device_replacement: '$1'
3479
3606
  brand_replacement: 'Msi'
@@ -3483,7 +3610,7 @@ device_parsers:
3483
3610
  # Multilaser
3484
3611
  # http://www.multilaser.com.br/listagem_produtos.php?cat=5
3485
3612
  #########
3486
- - regex: '; *Multilaser[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3613
+ - regex: '; {0,2}Multilaser[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3487
3614
  device_replacement: '$1'
3488
3615
  brand_replacement: 'Multilaser'
3489
3616
  model_replacement: '$1'
@@ -3492,15 +3619,15 @@ device_parsers:
3492
3619
  # MyPhone
3493
3620
  # @ref: http://myphone.com.ph/
3494
3621
  #########
3495
- - regex: '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3622
+ - regex: '; {0,2}(My)[_]?(Pad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3496
3623
  device_replacement: '$1$2 $3'
3497
3624
  brand_replacement: 'MyPhone'
3498
3625
  model_replacement: '$1$2 $3'
3499
- - regex: '; *(My)\|?(Phone)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3626
+ - regex: '; {0,2}(My)\|?(Phone)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3500
3627
  device_replacement: '$1$2 $3'
3501
3628
  brand_replacement: 'MyPhone'
3502
3629
  model_replacement: '$3'
3503
- - regex: '; *(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3630
+ - regex: '; {0,2}(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3504
3631
  regex_flag: 'i'
3505
3632
  device_replacement: '$1 $2'
3506
3633
  brand_replacement: 'MyPhone'
@@ -3510,7 +3637,7 @@ device_parsers:
3510
3637
  # Mytab
3511
3638
  # @ref: http://www.mytab.eu/en/category/mytab-products/
3512
3639
  #########
3513
- - regex: '; *(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3640
+ - regex: '; {0,2}(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3514
3641
  device_replacement: '$1'
3515
3642
  brand_replacement: 'Mytab'
3516
3643
  model_replacement: '$1'
@@ -3519,7 +3646,7 @@ device_parsers:
3519
3646
  # Nabi
3520
3647
  # @ref: https://www.nabitablet.com
3521
3648
  #########
3522
- - regex: '; *(NABI2?-)([^;/]+?)(?: Build|\) AppleWebKit)'
3649
+ - regex: '; {0,2}(NABI2?-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3523
3650
  device_replacement: '$1$2'
3524
3651
  brand_replacement: 'Nabi'
3525
3652
  model_replacement: '$2'
@@ -3528,15 +3655,15 @@ device_parsers:
3528
3655
  # Nec Medias
3529
3656
  # @ref: http://www.n-keitai.com/
3530
3657
  #########
3531
- - regex: '; *(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3658
+ - regex: '; {0,2}(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3532
3659
  device_replacement: '$1'
3533
3660
  brand_replacement: 'Nec'
3534
3661
  model_replacement: '$1'
3535
- - regex: '; ?(NEC-)(.*?)(?: Build|\) AppleWebKit)'
3662
+ - regex: '; ?(NEC-)(.{0,200}?)(?: Build|\) AppleWebKit)'
3536
3663
  device_replacement: '$1$2'
3537
3664
  brand_replacement: 'Nec'
3538
3665
  model_replacement: '$2'
3539
- - regex: '; *(LT-NA7)(?: Build|\) AppleWebKit)'
3666
+ - regex: '; {0,2}(LT-NA7)(?: Build|\) AppleWebKit)'
3540
3667
  device_replacement: '$1'
3541
3668
  brand_replacement: 'Nec'
3542
3669
  model_replacement: 'Lifetouch Note'
@@ -3545,7 +3672,7 @@ device_parsers:
3545
3672
  # Nextbook
3546
3673
  # @ref: http://nextbookusa.com
3547
3674
  #########
3548
- - regex: '; *(NXM\d+[A-Za-z0-9_]*|Next\d[A-Za-z0-9_ \-]*|NEXT\d[A-Za-z0-9_ \-]*|Nextbook [A-Za-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|[\);])'
3549
3676
  device_replacement: '$1'
3550
3677
  brand_replacement: 'Nextbook'
3551
3678
  model_replacement: '$1'
@@ -3554,12 +3681,12 @@ device_parsers:
3554
3681
  # Nokia
3555
3682
  # @ref: http://www.nokia.com
3556
3683
  #########
3557
- - regex: '; *(Nokia)([ _\-]*)([^;/]*) Build'
3684
+ - regex: '; {0,2}(Nokia)([ _\-]{0,5})([^;/]{0,50}) Build'
3558
3685
  regex_flag: 'i'
3559
3686
  device_replacement: '$1$2$3'
3560
3687
  brand_replacement: 'Nokia'
3561
3688
  model_replacement: '$3'
3562
- - regex: '; *(TA\-\d{4})(?: Build|\) AppleWebKit)'
3689
+ - regex: '; {0,2}(TA\-\d{4})(?: Build|\) AppleWebKit)'
3563
3690
  device_replacement: 'Nokia $1'
3564
3691
  brand_replacement: 'Nokia'
3565
3692
  model_replacement: '$1'
@@ -3569,11 +3696,11 @@ device_parsers:
3569
3696
  # @ref:
3570
3697
  # TODO nook browser/1.0
3571
3698
  #########
3572
- - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\) AppleWebKit)'
3699
+ - regex: '; {0,2}(Nook ?|Barnes & Noble Nook |BN )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3573
3700
  device_replacement: '$1$2'
3574
3701
  brand_replacement: 'Nook'
3575
3702
  model_replacement: '$2'
3576
- - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3703
+ - regex: '; {0,2}(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3577
3704
  device_replacement: '$1$2'
3578
3705
  brand_replacement: 'Nook'
3579
3706
  model_replacement: '$2'
@@ -3586,7 +3713,7 @@ device_parsers:
3586
3713
  # Olivetti
3587
3714
  # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
3588
3715
  #########
3589
- - regex: '; *(OP110|OliPad[^;/]+?)(?: Build|\) AppleWebKit)'
3716
+ - regex: '; {0,2}(OP110|OliPad[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3590
3717
  device_replacement: 'Olivetti $1'
3591
3718
  brand_replacement: 'Olivetti'
3592
3719
  model_replacement: '$1'
@@ -3597,7 +3724,7 @@ device_parsers:
3597
3724
  # @note: MID tablets might get matched by CobyKyros first
3598
3725
  # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
3599
3726
  #########
3600
- - regex: '; *OMEGA[ _\-](MID[^;/]+?)(?: Build|\) AppleWebKit)'
3727
+ - regex: '; {0,2}OMEGA[ _\-](MID[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3601
3728
  device_replacement: 'Omega $1'
3602
3729
  brand_replacement: 'Omega'
3603
3730
  model_replacement: '$1'
@@ -3610,7 +3737,7 @@ device_parsers:
3610
3737
  # OpenPeak
3611
3738
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
3612
3739
  #########
3613
- - regex: '; *((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3740
+ - regex: '; {0,2}((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3614
3741
  device_replacement: 'Openpeak $1'
3615
3742
  brand_replacement: 'Openpeak'
3616
3743
  model_replacement: '$1'
@@ -3619,18 +3746,18 @@ device_parsers:
3619
3746
  # Oppo
3620
3747
  # @ref: http://en.oppo.com/products/
3621
3748
  #########
3622
- - regex: '; *(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)'
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)'
3623
3750
  device_replacement: 'Oppo $1'
3624
3751
  brand_replacement: 'Oppo'
3625
3752
  model_replacement: '$1'
3626
- - regex: '; *OPPO ?([^;/]+?)(?: Build|\) AppleWebKit)'
3753
+ - regex: '; {0,2}OPPO ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3627
3754
  device_replacement: 'Oppo $1'
3628
3755
  brand_replacement: 'Oppo'
3629
3756
  model_replacement: '$1'
3630
- - regex: '; *(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3757
+ - regex: '; {0,2}(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3631
3758
  device_replacement: 'Oppo $1'
3632
3759
  brand_replacement: 'Oppo'
3633
- - regex: '; *(A1601)(?: Build|\) AppleWebKit)'
3760
+ - regex: '; {0,2}(A1601)(?: Build|\) AppleWebKit)'
3634
3761
  device_replacement: 'Oppo F1s'
3635
3762
  brand_replacement: 'Oppo'
3636
3763
  model_replacement: '$1'
@@ -3639,20 +3766,20 @@ device_parsers:
3639
3766
  # Odys
3640
3767
  # @ref: http://odys.de
3641
3768
  #########
3642
- - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+?)(?: Build|\) AppleWebKit)'
3769
+ - regex: '; {0,2}(?:Odys\-|ODYS\-|ODYS )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3643
3770
  device_replacement: 'Odys $1'
3644
3771
  brand_replacement: 'Odys'
3645
3772
  model_replacement: '$1'
3646
- - regex: '; *(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3773
+ - regex: '; {0,2}(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3647
3774
  device_replacement: 'Odys $1 $2'
3648
3775
  brand_replacement: 'Odys'
3649
3776
  model_replacement: '$1 $2'
3650
- - regex: '; *(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3777
+ - regex: '; {0,2}(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3651
3778
  device_replacement: 'Odys $1 $2 $3'
3652
3779
  brand_replacement: 'Odys'
3653
3780
  model_replacement: '$1 $2 $3'
3654
3781
  # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
3655
- - 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|\) AppleWebKit)'
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)'
3656
3783
  device_replacement: 'Odys $1'
3657
3784
  brand_replacement: 'Odys'
3658
3785
  model_replacement: '$1'
@@ -3674,7 +3801,7 @@ device_parsers:
3674
3801
  # Orion
3675
3802
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
3676
3803
  #########
3677
- - regex: '; *(TP-\d+)(?: Build|\) AppleWebKit)'
3804
+ - regex: '; {0,2}(TP-\d+)(?: Build|\) AppleWebKit)'
3678
3805
  device_replacement: 'Orion $1'
3679
3806
  brand_replacement: 'Orion'
3680
3807
  model_replacement: '$1'
@@ -3683,7 +3810,7 @@ device_parsers:
3683
3810
  # PackardBell
3684
3811
  # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
3685
3812
  #########
3686
- - regex: '; *(G100W?)(?: Build|\) AppleWebKit)'
3813
+ - regex: '; {0,2}(G100W?)(?: Build|\) AppleWebKit)'
3687
3814
  device_replacement: 'PackardBell $1'
3688
3815
  brand_replacement: 'PackardBell'
3689
3816
  model_replacement: '$1'
@@ -3694,17 +3821,17 @@ device_parsers:
3694
3821
  # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
3695
3822
  # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
3696
3823
  #########
3697
- - regex: '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\) AppleWebKit)'
3824
+ - regex: '; {0,2}(Panasonic)[_ ]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3698
3825
  device_replacement: '$1 $2'
3699
3826
  brand_replacement: '$1'
3700
3827
  model_replacement: '$2'
3701
3828
  # Toughpad
3702
- - regex: '; *(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3829
+ - regex: '; {0,2}(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3703
3830
  device_replacement: 'Panasonic $1'
3704
3831
  brand_replacement: 'Panasonic'
3705
3832
  model_replacement: '$1'
3706
3833
  # Eluga Power
3707
- - regex: '; *(dL1|DL1)(?: Build|\) AppleWebKit)'
3834
+ - regex: '; {0,2}(dL1|DL1)(?: Build|\) AppleWebKit)'
3708
3835
  device_replacement: 'Panasonic $1'
3709
3836
  brand_replacement: 'Panasonic'
3710
3837
  model_replacement: '$1'
@@ -3715,15 +3842,15 @@ device_parsers:
3715
3842
  # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
3716
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
3717
3844
  #########
3718
- - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
3845
+ - regex: '; {0,2}(SKY[ _]|)(IM\-[AT]\d{3}[^;/]{1,100}).{0,30} Build/'
3719
3846
  device_replacement: 'Pantech $1$2'
3720
3847
  brand_replacement: 'Pantech'
3721
3848
  model_replacement: '$1$2'
3722
- - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3849
+ - regex: '; {0,2}((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3723
3850
  device_replacement: '$1'
3724
3851
  brand_replacement: 'Pantech'
3725
3852
  model_replacement: '$1'
3726
- - regex: '; *Pantech([^;/]+).* Build/'
3853
+ - regex: '; {0,2}Pantech([^;/]{1,30}).{0,200}? Build/'
3727
3854
  device_replacement: 'Pantech $1'
3728
3855
  brand_replacement: 'Pantech'
3729
3856
  model_replacement: '$1'
@@ -3732,7 +3859,7 @@ device_parsers:
3732
3859
  # Papayre
3733
3860
  # @ref: http://grammata.es/
3734
3861
  #########
3735
- - regex: '; *(papyre)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3862
+ - regex: '; {0,2}(papyre)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3736
3863
  regex_flag: 'i'
3737
3864
  device_replacement: '$1 $2'
3738
3865
  brand_replacement: 'Papyre'
@@ -3742,7 +3869,7 @@ device_parsers:
3742
3869
  # Pearl
3743
3870
  # @ref: http://www.pearl.de/c-1540.shtml
3744
3871
  #########
3745
- - regex: '; *(?:Touchlet )?(X10\.[^;/]+?)(?: Build|\) AppleWebKit)'
3872
+ - regex: '; {0,2}(?:Touchlet )?(X10\.[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3746
3873
  device_replacement: 'Pearl $1'
3747
3874
  brand_replacement: 'Pearl'
3748
3875
  model_replacement: '$1'
@@ -3755,11 +3882,11 @@ device_parsers:
3755
3882
  device_replacement: 'Phicomm $1'
3756
3883
  brand_replacement: 'Phicomm'
3757
3884
  model_replacement: '$1'
3758
- - regex: '; PHICOMM ([^;/]+?)(?: Build|\) AppleWebKit)'
3885
+ - regex: '; PHICOMM ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3759
3886
  device_replacement: 'Phicomm $1'
3760
3887
  brand_replacement: 'Phicomm'
3761
3888
  model_replacement: '$1'
3762
- - regex: '; *(FWS\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
3889
+ - regex: '; {0,2}(FWS\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3763
3890
  device_replacement: 'Phicomm $1'
3764
3891
  brand_replacement: 'Phicomm'
3765
3892
  model_replacement: '$1'
@@ -3771,11 +3898,11 @@ device_parsers:
3771
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
3772
3899
  #########
3773
3900
  # @note: this a best guess according to available philips models. Need more User-Agents
3774
- - 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|\) AppleWebKit)'
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)'
3775
3902
  device_replacement: '$1'
3776
3903
  brand_replacement: 'Philips'
3777
3904
  model_replacement: '$1'
3778
- - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3905
+ - regex: '; {0,2}(?:Philips|PHILIPS)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3779
3906
  device_replacement: 'Philips $1'
3780
3907
  brand_replacement: 'Philips'
3781
3908
  model_replacement: '$1'
@@ -3784,7 +3911,7 @@ device_parsers:
3784
3911
  # Pipo
3785
3912
  # @ref: http://www.pipo.cn/En/
3786
3913
  #########
3787
- - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3914
+ - regex: 'Android 4\..{0,200}; {0,2}(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3788
3915
  device_replacement: 'Pipo $1$2'
3789
3916
  brand_replacement: 'Pipo'
3790
3917
  model_replacement: '$1$2'
@@ -3793,7 +3920,7 @@ device_parsers:
3793
3920
  # Ployer
3794
3921
  # @ref: http://en.ployer.cn/
3795
3922
  #########
3796
- - regex: '; *(MOMO[^;/]+?)(?: Build|\) AppleWebKit)'
3923
+ - regex: '; {0,2}(MOMO[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3797
3924
  device_replacement: '$1'
3798
3925
  brand_replacement: 'Ployer'
3799
3926
  model_replacement: '$1'
@@ -3802,11 +3929,11 @@ device_parsers:
3802
3929
  # Polaroid/ Acho
3803
3930
  # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
3804
3931
  #########
3805
- - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*?)(\/[^;/]*|)(?: Build|\) AppleWebKit)'
3932
+ - regex: '; {0,2}(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]{0,30}?)(\/[^;/]{0,30}|)(?: Build|\) AppleWebKit)'
3806
3933
  device_replacement: '$1'
3807
3934
  brand_replacement: 'Polaroid'
3808
3935
  model_replacement: '$1'
3809
- - regex: '; *(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3936
+ - regex: '; {0,2}(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3810
3937
  device_replacement: '$1'
3811
3938
  brand_replacement: 'Polaroid'
3812
3939
  model_replacement: '$1'
@@ -3816,7 +3943,7 @@ device_parsers:
3816
3943
  # @ref: http://pompmobileshop.com/
3817
3944
  #########
3818
3945
  #~ TODO
3819
- - regex: '; *(POMP)[ _\-](.+?) *(?:Build|[;/\)])'
3946
+ - regex: '; {0,2}(POMP)[ _\-](.{1,200}?) {0,2}(?:Build|[;/\)])'
3820
3947
  device_replacement: '$1 $2'
3821
3948
  brand_replacement: 'Pomp'
3822
3949
  model_replacement: '$2'
@@ -3825,11 +3952,11 @@ device_parsers:
3825
3952
  # Positivo
3826
3953
  # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
3827
3954
  #########
3828
- - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3955
+ - regex: '; {0,2}(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3829
3956
  device_replacement: '$1'
3830
3957
  brand_replacement: 'Positivo'
3831
3958
  model_replacement: '$1'
3832
- - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\) AppleWebKit)'
3959
+ - regex: '; {0,2}(?:Positivo |)((?:YPY|Ypy)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3833
3960
  device_replacement: '$1'
3834
3961
  brand_replacement: 'Positivo'
3835
3962
  model_replacement: '$1'
@@ -3839,15 +3966,15 @@ device_parsers:
3839
3966
  # @ref: http://www.pointofview-online.com/default2.php
3840
3967
  # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
3841
3968
  #########
3842
- - regex: '; *(MOB-[^;/]+?)(?: Build|\) AppleWebKit)'
3969
+ - regex: '; {0,2}(MOB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3843
3970
  device_replacement: '$1'
3844
3971
  brand_replacement: 'POV'
3845
3972
  model_replacement: '$1'
3846
- - regex: '; *POV[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3973
+ - regex: '; {0,2}POV[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3847
3974
  device_replacement: 'POV $1'
3848
3975
  brand_replacement: 'POV'
3849
3976
  model_replacement: '$1'
3850
- - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3977
+ - regex: '; {0,2}((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3851
3978
  device_replacement: 'POV $1'
3852
3979
  brand_replacement: 'POV'
3853
3980
  model_replacement: '$1'
@@ -3857,7 +3984,7 @@ device_parsers:
3857
3984
  # @ref: http://www.prestigio.com/catalogue/MultiPhones
3858
3985
  # @ref: http://www.prestigio.com/catalogue/MultiPads
3859
3986
  #########
3860
- - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+?)(?: Build|\) AppleWebKit)'
3987
+ - regex: '; {0,2}(?:Prestigio |)((?:PAP|PMP)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3861
3988
  device_replacement: 'Prestigio $1'
3862
3989
  brand_replacement: 'Prestigio'
3863
3990
  model_replacement: '$1'
@@ -3866,7 +3993,7 @@ device_parsers:
3866
3993
  # Proscan
3867
3994
  # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
3868
3995
  #########
3869
- - regex: '; *(PLT[0-9]{4}.*?)(?: Build|\) AppleWebKit)'
3996
+ - regex: '; {0,2}(PLT[0-9]{4}.{0,200}?)(?: Build|\) AppleWebKit)'
3870
3997
  device_replacement: '$1'
3871
3998
  brand_replacement: 'Proscan'
3872
3999
  model_replacement: '$1'
@@ -3875,15 +4002,15 @@ device_parsers:
3875
4002
  # QMobile
3876
4003
  # @ref: http://www.qmobile.com.pk/
3877
4004
  #########
3878
- - regex: '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
4005
+ - regex: '; {0,2}(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
3879
4006
  device_replacement: '$1 $2'
3880
4007
  brand_replacement: 'Qmobile'
3881
4008
  model_replacement: '$1 $2'
3882
- - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
4009
+ - regex: '; {0,2}(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
3883
4010
  device_replacement: 'Qmobile $2 $3'
3884
4011
  brand_replacement: 'Qmobile'
3885
4012
  model_replacement: '$2 $3'
3886
- - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\) AppleWebKit)'
4013
+ - regex: '; {0,2}(Q\-?[Mm]obile)[_ ](A[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3887
4014
  device_replacement: 'Qmobile $2'
3888
4015
  brand_replacement: 'Qmobile'
3889
4016
  model_replacement: '$2'
@@ -3892,11 +4019,11 @@ device_parsers:
3892
4019
  # Qmobilevn
3893
4020
  # @ref: http://qmobile.vn/san-pham.html
3894
4021
  #########
3895
- - regex: '; *(Q\-Smart)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4022
+ - regex: '; {0,2}(Q\-Smart)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3896
4023
  device_replacement: '$1 $2'
3897
4024
  brand_replacement: 'Qmobilevn'
3898
4025
  model_replacement: '$2'
3899
- - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+?)(?: Build|\) AppleWebKit)'
4026
+ - regex: '; {0,2}(Q\-?[Mm]obile)[ _\-](S[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3900
4027
  device_replacement: '$1 $2'
3901
4028
  brand_replacement: 'Qmobilevn'
3902
4029
  model_replacement: '$2'
@@ -3905,7 +4032,7 @@ device_parsers:
3905
4032
  # Quanta
3906
4033
  # @ref: ?
3907
4034
  #########
3908
- - regex: '; *(TA1013)(?: Build|\) AppleWebKit)'
4035
+ - regex: '; {0,2}(TA1013)(?: Build|\) AppleWebKit)'
3909
4036
  device_replacement: '$1'
3910
4037
  brand_replacement: 'Quanta'
3911
4038
  model_replacement: '$1'
@@ -3928,7 +4055,7 @@ device_parsers:
3928
4055
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
3929
4056
  # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
3930
4057
  #########
3931
- - regex: '; *(RK\d+),?(?: Build|\) AppleWebKit)'
4058
+ - regex: '; {0,2}(RK\d+),?(?: Build|\) AppleWebKit)'
3932
4059
  device_replacement: '$1'
3933
4060
  brand_replacement: 'Rockchip'
3934
4061
  model_replacement: '$1'
@@ -3941,55 +4068,55 @@ device_parsers:
3941
4068
  # Samsung Android Devices
3942
4069
  # @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
3943
4070
  #########
3944
- - 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/'
3945
4072
  device_replacement: 'Samsung $1$2'
3946
4073
  brand_replacement: 'Samsung'
3947
4074
  model_replacement: '$2'
3948
- - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
4075
+ - regex: '; {0,2}(Google |)(Nexus [Ss](?: 4G|)) Build/'
3949
4076
  device_replacement: 'Samsung $1$2'
3950
4077
  brand_replacement: 'Samsung'
3951
4078
  model_replacement: '$2'
3952
- - regex: '; *(SAMSUNG |Samsung )([^\/]*)\/[^ ]* Build/'
4079
+ - regex: '; {0,2}(SAMSUNG |Samsung )([^\/]{0,50})\/[^ ]{0,50} Build/'
3953
4080
  device_replacement: 'Samsung $2'
3954
4081
  brand_replacement: 'Samsung'
3955
4082
  model_replacement: '$2'
3956
- - 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/'
3957
4084
  device_replacement: 'Samsung $1'
3958
4085
  brand_replacement: 'Samsung'
3959
4086
  model_replacement: '$1'
3960
- - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
4087
+ - regex: '; {0,2}(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]{1,100}) Build'
3961
4088
  device_replacement: 'Samsung $2'
3962
4089
  brand_replacement: 'Samsung'
3963
4090
  model_replacement: '$2'
3964
- - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
4091
+ - regex: '; {0,2}(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]{0,50})(\/[^ ]{0,50}) Build'
3965
4092
  device_replacement: 'Samsung $1$2$3'
3966
4093
  brand_replacement: 'Samsung'
3967
4094
  model_replacement: '$2'
3968
- - 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|[;/\)])'
3969
4096
  device_replacement: 'Samsung $1'
3970
4097
  brand_replacement: 'Samsung'
3971
4098
  model_replacement: '$1'
3972
- - regex: '; (SAMSUNG-)([A-Za-z0-9\-]+).* Build/'
4099
+ - regex: '; (SAMSUNG-)([A-Za-z0-9\-]{0,50}).{0,200} Build/'
3973
4100
  device_replacement: 'Samsung $1$2'
3974
4101
  brand_replacement: 'Samsung'
3975
4102
  model_replacement: '$2'
3976
- - 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'
3977
4104
  device_replacement: 'Samsung $1'
3978
4105
  brand_replacement: 'Samsung'
3979
4106
  model_replacement: '$1'
3980
- - regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
4107
+ - regex: '; {0,2}((?:SC)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|)\)'
3981
4108
  device_replacement: 'Samsung $1'
3982
4109
  brand_replacement: 'Samsung'
3983
4110
  model_replacement: '$1'
3984
- - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4111
+ - regex: ' ((?:SCH)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3985
4112
  device_replacement: 'Samsung $1'
3986
4113
  brand_replacement: 'Samsung'
3987
4114
  model_replacement: '$1'
3988
- - 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'
3989
4116
  device_replacement: 'Samsung $1'
3990
4117
  brand_replacement: 'Samsung'
3991
4118
  model_replacement: '$1'
3992
- - 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})[\)]'
3993
4120
  device_replacement: 'Samsung $1'
3994
4121
  brand_replacement: 'Samsung'
3995
4122
  model_replacement: '$1'
@@ -3999,11 +4126,11 @@ device_parsers:
3999
4126
  # @ref: http://www.sharp-phone.com/en/index.html
4000
4127
  # @ref: http://www.android.com/devices/?country=all&m=sharp
4001
4128
  #########
4002
- - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+?)(?: Build|\) AppleWebKit)'
4129
+ - regex: '; {0,2}(SH\-?\d\d[^;/]{1,100}|SBM\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4003
4130
  device_replacement: '$1'
4004
4131
  brand_replacement: 'Sharp'
4005
4132
  model_replacement: '$1'
4006
- - regex: '; *(SHARP[ -])([^;/]+?)(?: Build|\) AppleWebKit)'
4133
+ - regex: '; {0,2}(SHARP[ -])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4007
4134
  device_replacement: '$1$2'
4008
4135
  brand_replacement: 'Sharp'
4009
4136
  model_replacement: '$2'
@@ -4012,15 +4139,15 @@ device_parsers:
4012
4139
  # Simvalley
4013
4140
  # @ref: http://www.simvalley-mobile.de/
4014
4141
  #########
4015
- - regex: '; *(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
4142
+ - regex: '; {0,2}(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
4016
4143
  device_replacement: '$1'
4017
4144
  brand_replacement: 'Simvalley'
4018
4145
  model_replacement: '$1'
4019
- - regex: '; *(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
4146
+ - regex: '; {0,2}(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
4020
4147
  device_replacement: '$1'
4021
4148
  brand_replacement: 'Simvalley'
4022
4149
  model_replacement: '$1'
4023
- - regex: '; *(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
4150
+ - regex: '; {0,2}(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
4024
4151
  device_replacement: '$1'
4025
4152
  brand_replacement: 'Simvalley'
4026
4153
  model_replacement: '$1'
@@ -4030,7 +4157,7 @@ device_parsers:
4030
4157
  # @ref: http://www.sk-w.com/phone/phone_list.jsp
4031
4158
  # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
4032
4159
  #########
4033
- - regex: '; *(SK\-.*?)(?: Build|\) AppleWebKit)'
4160
+ - regex: '; {0,2}(SK\-.{0,200}?)(?: Build|\) AppleWebKit)'
4034
4161
  device_replacement: '$1'
4035
4162
  brand_replacement: 'SKtelesys'
4036
4163
  model_replacement: '$1'
@@ -4039,11 +4166,11 @@ device_parsers:
4039
4166
  # Skytex
4040
4167
  # @ref: http://skytex.com/android
4041
4168
  #########
4042
- - regex: '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\) AppleWebKit)'
4169
+ - regex: '; {0,2}(?:SKYTEX|SX)-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4043
4170
  device_replacement: '$1'
4044
4171
  brand_replacement: 'Skytex'
4045
4172
  model_replacement: '$1'
4046
- - regex: '; *(IMAGINE [^;/]+?)(?: Build|\) AppleWebKit)'
4173
+ - regex: '; {0,2}(IMAGINE [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4047
4174
  device_replacement: '$1'
4048
4175
  brand_replacement: 'Skytex'
4049
4176
  model_replacement: '$1'
@@ -4053,7 +4180,7 @@ device_parsers:
4053
4180
  # @ref: http://en.smartdevices.com.cn/Products/
4054
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
4055
4182
  #########
4056
- - regex: '; *(SmartQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4183
+ - regex: '; {0,2}(SmartQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4057
4184
  device_replacement: '$1 $2'
4058
4185
  brand_replacement: '$1'
4059
4186
  model_replacement: '$2'
@@ -4063,7 +4190,7 @@ device_parsers:
4063
4190
  # @ref: http://www.smartbitt.com/
4064
4191
  # @missing: SBT Useragents
4065
4192
  #########
4066
- - regex: '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\) AppleWebKit)'
4193
+ - regex: '; {0,2}(WF7C|WF10C|SBT[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4067
4194
  device_replacement: '$1'
4068
4195
  brand_replacement: 'Smartbitt'
4069
4196
  model_replacement: '$1'
@@ -4072,15 +4199,15 @@ device_parsers:
4072
4199
  # Softbank (Operator Branded Devices)
4073
4200
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
4074
4201
  #########
4075
- - regex: '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4202
+ - regex: '; {0,2}(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4076
4203
  device_replacement: '$1'
4077
4204
  brand_replacement: 'Sharp'
4078
4205
  model_replacement: '$1'
4079
- - regex: '; *(003P|101P|101P11C|102P) Build'
4206
+ - regex: '; {0,2}(003P|101P|101P11C|102P) Build'
4080
4207
  device_replacement: '$1'
4081
4208
  brand_replacement: 'Panasonic'
4082
4209
  model_replacement: '$1'
4083
- - regex: '; *(00\dZ) Build/'
4210
+ - regex: '; {0,2}(00\dZ) Build/'
4084
4211
  device_replacement: '$1'
4085
4212
  brand_replacement: 'ZTE'
4086
4213
  model_replacement: '$1'
@@ -4088,11 +4215,11 @@ device_parsers:
4088
4215
  device_replacement: '$1'
4089
4216
  brand_replacement: 'HTC'
4090
4217
  model_replacement: '$1'
4091
- - regex: '; *(001HT|X06HT) Build'
4218
+ - regex: '; {0,2}(001HT|X06HT) Build'
4092
4219
  device_replacement: '$1'
4093
4220
  brand_replacement: 'HTC'
4094
4221
  model_replacement: '$1'
4095
- - regex: '; *(201M) Build'
4222
+ - regex: '; {0,2}(201M) Build'
4096
4223
  device_replacement: '$1'
4097
4224
  brand_replacement: 'Motorola'
4098
4225
  model_replacement: 'XT902'
@@ -4102,11 +4229,11 @@ device_parsers:
4102
4229
  # @ref: http://www.trekstor.co.uk/surftabs-en.html
4103
4230
  # @note: Must come before SonyEricsson
4104
4231
  #########
4105
- - regex: '; *(ST\d{4}.*)Build/ST'
4232
+ - regex: '; {0,2}(ST\d{4}.{0,200})Build/ST'
4106
4233
  device_replacement: 'Trekstor $1'
4107
4234
  brand_replacement: 'Trekstor'
4108
4235
  model_replacement: '$1'
4109
- - regex: '; *(ST\d{4}.*?)(?: Build|\) AppleWebKit)'
4236
+ - regex: '; {0,2}(ST\d{4}.{0,200}?)(?: Build|\) AppleWebKit)'
4110
4237
  device_replacement: 'Trekstor $1'
4111
4238
  brand_replacement: 'Trekstor'
4112
4239
  model_replacement: '$1'
@@ -4118,16 +4245,16 @@ device_parsers:
4118
4245
  # @TODO: type!
4119
4246
  #########
4120
4247
  # android matchers
4121
- - regex: '; *(Sony ?Ericsson ?)([^;/]+) Build'
4248
+ - regex: '; {0,2}(Sony ?Ericsson ?)([^;/]{1,100}) Build'
4122
4249
  device_replacement: '$1$2'
4123
4250
  brand_replacement: 'SonyEricsson'
4124
4251
  model_replacement: '$2'
4125
- - 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'
4126
4253
  device_replacement: '$1'
4127
4254
  brand_replacement: 'SonyEricsson'
4128
4255
  model_replacement: '$1'
4129
4256
  # TODO X\d+ is wrong
4130
- - 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'
4131
4258
  regex_flag: 'i'
4132
4259
  device_replacement: '$1'
4133
4260
  brand_replacement: 'SonyEricsson'
@@ -4139,31 +4266,31 @@ device_parsers:
4139
4266
  # @ref: http://www.sonymobile.com/global-en/products/phones/
4140
4267
  # @ref: http://www.sony.jp/tablet/
4141
4268
  #########
4142
- - regex: '; Sony (Tablet[^;/]+?)(?: Build|\) AppleWebKit)'
4269
+ - regex: '; Sony (Tablet[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4143
4270
  device_replacement: 'Sony $1'
4144
4271
  brand_replacement: 'Sony'
4145
4272
  model_replacement: '$1'
4146
- - regex: '; Sony ([^;/]+?)(?: Build|\) AppleWebKit)'
4273
+ - regex: '; Sony ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4147
4274
  device_replacement: 'Sony $1'
4148
4275
  brand_replacement: 'Sony'
4149
4276
  model_replacement: '$1'
4150
- - regex: '; *(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4277
+ - regex: '; {0,2}(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4151
4278
  device_replacement: '$1 $2'
4152
4279
  brand_replacement: '$1'
4153
4280
  model_replacement: '$2'
4154
- - regex: '; *(Xperia [^;/]+?)(?: Build|\) AppleWebKit)'
4281
+ - regex: '; {0,2}(Xperia [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4155
4282
  device_replacement: '$1'
4156
4283
  brand_replacement: 'Sony'
4157
4284
  model_replacement: '$1'
4158
- - 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|\) AppleWebKit)'
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)'
4159
4286
  device_replacement: '$1'
4160
4287
  brand_replacement: 'Sony'
4161
4288
  model_replacement: '$1'
4162
- - regex: '; *(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4289
+ - regex: '; {0,2}(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4163
4290
  device_replacement: '$1'
4164
4291
  brand_replacement: 'Sony'
4165
4292
  model_replacement: '$1'
4166
- - regex: '; *(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4293
+ - regex: '; {0,2}(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4167
4294
  device_replacement: '$1'
4168
4295
  brand_replacement: 'Sony'
4169
4296
  model_replacement: '$1'
@@ -4186,7 +4313,7 @@ device_parsers:
4186
4313
  # Spice
4187
4314
  # @ref: http://www.spicemobilephones.co.in/
4188
4315
  #########
4189
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4316
+ - regex: '; {0,2}((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4190
4317
  device_replacement: '$1$2$3$4'
4191
4318
  brand_replacement: 'Spice'
4192
4319
  model_replacement: 'Mi$4'
@@ -4195,7 +4322,7 @@ device_parsers:
4195
4322
  # Sprint (Operator Branded Devices)
4196
4323
  # @ref:
4197
4324
  #########
4198
- - regex: '; *(Sprint )(.+?) *(?:Build|[;/])'
4325
+ - regex: '; {0,2}(Sprint )(.{1,200}?) {0,2}(?:Build|[;/])'
4199
4326
  device_replacement: '$1$2'
4200
4327
  brand_replacement: 'Sprint'
4201
4328
  model_replacement: '$2'
@@ -4208,7 +4335,7 @@ device_parsers:
4208
4335
  # Tagi
4209
4336
  # @ref: ??
4210
4337
  #########
4211
- - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4338
+ - regex: '; {0,2}(TAGI[ ]?)(MID) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4212
4339
  device_replacement: '$1$2$3'
4213
4340
  brand_replacement: 'Tagi'
4214
4341
  model_replacement: '$2$3'
@@ -4217,7 +4344,7 @@ device_parsers:
4217
4344
  # Tecmobile
4218
4345
  # @ref: http://www.tecmobile.com/
4219
4346
  #########
4220
- - regex: '; *(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4347
+ - regex: '; {0,2}(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4221
4348
  device_replacement: 'Tecmobile $1'
4222
4349
  brand_replacement: 'Tecmobile'
4223
4350
  model_replacement: '$1'
@@ -4226,7 +4353,7 @@ device_parsers:
4226
4353
  # Tecno
4227
4354
  # @ref: www.tecno-mobile.com/‎
4228
4355
  #########
4229
- - regex: '; *(TECNO[ _])([^;/]+?)(?: Build|\) AppleWebKit)'
4356
+ - regex: '; {0,2}(TECNO[ _])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4230
4357
  device_replacement: '$1$2'
4231
4358
  brand_replacement: 'Tecno'
4232
4359
  model_replacement: '$2'
@@ -4235,7 +4362,7 @@ device_parsers:
4235
4362
  # Telechips, Techvision evaluation boards
4236
4363
  # @ref:
4237
4364
  #########
4238
- - regex: '; *Android for (Telechips|Techvision) ([^ ]+) '
4365
+ - regex: '; {0,2}Android for (Telechips|Techvision) ([^ ]+) '
4239
4366
  regex_flag: 'i'
4240
4367
  device_replacement: '$1 $2'
4241
4368
  brand_replacement: '$1'
@@ -4246,7 +4373,7 @@ device_parsers:
4246
4373
  # @ref: http://www.telstra.com.au/home-phone/thub-2/
4247
4374
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
4248
4375
  #########
4249
- - regex: '; *(T-Hub2)(?: Build|\) AppleWebKit)'
4376
+ - regex: '; {0,2}(T-Hub2)(?: Build|\) AppleWebKit)'
4250
4377
  device_replacement: '$1'
4251
4378
  brand_replacement: 'Telstra'
4252
4379
  model_replacement: '$1'
@@ -4255,7 +4382,7 @@ device_parsers:
4255
4382
  # Terra
4256
4383
  # @ref: http://www.wortmann.de/
4257
4384
  #########
4258
- - regex: '; *(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4385
+ - regex: '; {0,2}(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4259
4386
  device_replacement: 'Terra $1$2'
4260
4387
  brand_replacement: 'Terra'
4261
4388
  model_replacement: '$1$2'
@@ -4264,7 +4391,7 @@ device_parsers:
4264
4391
  # Texet
4265
4392
  # @ref: http://www.texet.ru/tablet/
4266
4393
  #########
4267
- - regex: '; *(T[BM]-\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
4394
+ - regex: '; {0,2}(T[BM]-\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4268
4395
  device_replacement: '$1'
4269
4396
  brand_replacement: 'Texet'
4270
4397
  model_replacement: '$1'
@@ -4273,11 +4400,11 @@ device_parsers:
4273
4400
  # Thalia
4274
4401
  # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
4275
4402
  #########
4276
- - regex: '; *(tolino [^;/]+?)(?: Build|\) AppleWebKit)'
4403
+ - regex: '; {0,2}(tolino [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4277
4404
  device_replacement: '$1'
4278
4405
  brand_replacement: 'Thalia'
4279
4406
  model_replacement: '$1'
4280
- - regex: '; *Build/.* (TOLINO_BROWSER)'
4407
+ - regex: '; {0,2}Build/.{0,200} (TOLINO_BROWSER)'
4281
4408
  device_replacement: '$1'
4282
4409
  brand_replacement: 'Thalia'
4283
4410
  model_replacement: 'Tolino Shine'
@@ -4287,11 +4414,11 @@ device_parsers:
4287
4414
  # @ref: http://en.thl.com.cn/Mobile
4288
4415
  # @ref: http://thlmobilestore.com
4289
4416
  #########
4290
- - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\) AppleWebKit)'
4417
+ - regex: '; {0,2}(?:CJ[ -])?(ThL|THL)[ -]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4291
4418
  device_replacement: '$1 $2'
4292
4419
  brand_replacement: 'Thl'
4293
4420
  model_replacement: '$2'
4294
- - regex: '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4421
+ - regex: '; {0,2}(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4295
4422
  device_replacement: '$1'
4296
4423
  brand_replacement: 'Thl'
4297
4424
  model_replacement: '$1'
@@ -4300,28 +4427,28 @@ device_parsers:
4300
4427
  # T-Mobile (Operator Branded Devices)
4301
4428
  #########
4302
4429
  # @ref: https://en.wikipedia.org/wiki/HTC_Hero
4303
- - regex: '; *(T-Mobile[ _]G2[ _]Touch) Build'
4430
+ - regex: '; {0,2}(T-Mobile[ _]G2[ _]Touch) Build'
4304
4431
  device_replacement: '$1'
4305
4432
  brand_replacement: 'HTC'
4306
4433
  model_replacement: 'Hero'
4307
4434
  # @ref: https://en.wikipedia.org/wiki/HTC_Desire_Z
4308
- - regex: '; *(T-Mobile[ _]G2) Build'
4435
+ - regex: '; {0,2}(T-Mobile[ _]G2) Build'
4309
4436
  device_replacement: '$1'
4310
4437
  brand_replacement: 'HTC'
4311
4438
  model_replacement: 'Desire Z'
4312
- - regex: '; *(T-Mobile myTouch Q) Build'
4439
+ - regex: '; {0,2}(T-Mobile myTouch Q) Build'
4313
4440
  device_replacement: '$1'
4314
4441
  brand_replacement: 'Huawei'
4315
4442
  model_replacement: 'U8730'
4316
- - regex: '; *(T-Mobile myTouch) Build'
4443
+ - regex: '; {0,2}(T-Mobile myTouch) Build'
4317
4444
  device_replacement: '$1'
4318
4445
  brand_replacement: 'Huawei'
4319
4446
  model_replacement: 'U8680'
4320
- - regex: '; *(T-Mobile_Espresso) Build'
4447
+ - regex: '; {0,2}(T-Mobile_Espresso) Build'
4321
4448
  device_replacement: '$1'
4322
4449
  brand_replacement: 'HTC'
4323
4450
  model_replacement: 'Espresso'
4324
- - regex: '; *(T-Mobile G1) Build'
4451
+ - regex: '; {0,2}(T-Mobile G1) Build'
4325
4452
  device_replacement: '$1'
4326
4453
  brand_replacement: 'HTC'
4327
4454
  model_replacement: 'Dream'
@@ -4329,11 +4456,11 @@ device_parsers:
4329
4456
  device_replacement: '$1$2 $3 $4'
4330
4457
  brand_replacement: 'HTC'
4331
4458
  model_replacement: '$2 $3 $4'
4332
- - regex: '\b(T-Mobile)_([^_]+)_(.*) Build'
4459
+ - regex: '\b(T-Mobile)_([^_]+)_(.{0,200}) Build'
4333
4460
  device_replacement: '$1 $2 $3'
4334
4461
  brand_replacement: 'Tmobile'
4335
4462
  model_replacement: '$2 $3'
4336
- - regex: '\b(T-Mobile)[_ ]?(.*?)Build'
4463
+ - regex: '\b(T-Mobile)[_ ]?(.{0,200}?)Build'
4337
4464
  device_replacement: '$1 $2'
4338
4465
  brand_replacement: 'Tmobile'
4339
4466
  model_replacement: '$2'
@@ -4351,7 +4478,7 @@ device_parsers:
4351
4478
  # Tooky
4352
4479
  # @ref: http://www.tookymobile.com/
4353
4480
  #########
4354
- - regex: ' *(TOOKY)[ _\-]([^;/]+?) ?(?:Build|;)'
4481
+ - regex: ' ?(TOOKY)[ _\-]([^;/]{1,100}) ?(?:Build|;)'
4355
4482
  regex_flag: 'i'
4356
4483
  device_replacement: '$1 $2'
4357
4484
  brand_replacement: 'Tooky'
@@ -4366,11 +4493,11 @@ device_parsers:
4366
4493
  device_replacement: '$1'
4367
4494
  brand_replacement: 'Toshiba'
4368
4495
  model_replacement: 'Folio 100'
4369
- - regex: '; *([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4496
+ - regex: '; {0,2}([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4370
4497
  device_replacement: '$1'
4371
4498
  brand_replacement: 'Toshiba'
4372
4499
  model_replacement: 'Folio 100'
4373
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
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)'
4374
4501
  device_replacement: 'Toshiba $1'
4375
4502
  brand_replacement: 'Toshiba'
4376
4503
  model_replacement: '$1'
@@ -4379,12 +4506,12 @@ device_parsers:
4379
4506
  # Touchmate
4380
4507
  # @ref: http://touchmatepc.com/new/
4381
4508
  #########
4382
- - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4509
+ - regex: '; {0,2}(TM-MID\d+[^;/]{1,50}|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4383
4510
  device_replacement: '$1'
4384
4511
  brand_replacement: 'Touchmate'
4385
4512
  model_replacement: '$1'
4386
4513
  # @todo: needs verification user-agents missing
4387
- - regex: '; *(TM-SM\d+[^;/]+?)(?: Build|\) AppleWebKit)'
4514
+ - regex: '; {0,2}(TM-SM\d+[^;/]{1,50}?)(?: Build|\) AppleWebKit)'
4388
4515
  device_replacement: '$1'
4389
4516
  brand_replacement: 'Touchmate'
4390
4517
  model_replacement: '$1'
@@ -4393,11 +4520,11 @@ device_parsers:
4393
4520
  # Treq
4394
4521
  # @ref: http://www.treq.co.id/product
4395
4522
  #########
4396
- - regex: '; *(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4523
+ - regex: '; {0,2}(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4397
4524
  device_replacement: '$1'
4398
4525
  brand_replacement: 'Treq'
4399
4526
  model_replacement: '$1'
4400
- - regex: '; *(TREQ[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
4527
+ - regex: '; {0,2}(TREQ[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4401
4528
  regex_flag: 'i'
4402
4529
  device_replacement: '$1$2'
4403
4530
  brand_replacement: 'Treq'
@@ -4409,21 +4536,40 @@ device_parsers:
4409
4536
  # @models: A936|A603|X-5|X-3
4410
4537
  #########
4411
4538
  # @todo: guessed markers
4412
- - regex: '; *(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4539
+ - regex: '; {0,2}(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4413
4540
  device_replacement: '$1'
4414
4541
  brand_replacement: 'Umeox'
4415
4542
  model_replacement: '$1'
4416
4543
  # @todo: guessed markers
4417
- - regex: '; *(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4544
+ - regex: '; {0,2}(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4418
4545
  device_replacement: '$1'
4419
4546
  brand_replacement: 'Umeox'
4420
4547
  model_replacement: '$1'
4421
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
+
4422
4568
  #########
4423
4569
  # Versus
4424
4570
  # @ref: http://versusuk.com/support.html
4425
4571
  #########
4426
- - regex: '(TOUCH(?:TAB|PAD).+?)(?: Build|\) AppleWebKit)'
4572
+ - regex: '(TOUCH(?:TAB|PAD).{1,200}?)(?: Build|\) AppleWebKit)'
4427
4573
  regex_flag: 'i'
4428
4574
  device_replacement: 'Versus $1'
4429
4575
  brand_replacement: 'Versus'
@@ -4433,7 +4579,7 @@ device_parsers:
4433
4579
  # Vertu
4434
4580
  # @ref: http://www.vertu.com/
4435
4581
  #########
4436
- - regex: '(VERTU) ([^;/]+?)(?: Build|\) AppleWebKit)'
4582
+ - regex: '(VERTU) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4437
4583
  device_replacement: '$1 $2'
4438
4584
  brand_replacement: 'Vertu'
4439
4585
  model_replacement: '$2'
@@ -4442,7 +4588,7 @@ device_parsers:
4442
4588
  # Videocon
4443
4589
  # @ref: http://www.videoconmobiles.com
4444
4590
  #########
4445
- - regex: '; *(Videocon)[ _\-]([^;/]+?) *(?:Build|;)'
4591
+ - regex: '; {0,2}(Videocon)[ _\-]([^;/]{1,100}?) {0,2}(?:Build|;)'
4446
4592
  device_replacement: '$1 $2'
4447
4593
  brand_replacement: 'Videocon'
4448
4594
  model_replacement: '$2'
@@ -4455,15 +4601,15 @@ device_parsers:
4455
4601
  # Viewsonic
4456
4602
  # @ref: http://viewsonic.com
4457
4603
  #########
4458
- - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\) AppleWebKit)'
4604
+ - regex: '; {0,2}((?:ViewPad|ViewPhone|VSD)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4459
4605
  device_replacement: '$1'
4460
4606
  brand_replacement: 'Viewsonic'
4461
4607
  model_replacement: '$1'
4462
- - regex: '; *(ViewSonic-)([^;/]+?)(?: Build|\) AppleWebKit)'
4608
+ - regex: '; {0,2}(ViewSonic-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4463
4609
  device_replacement: '$1$2'
4464
4610
  brand_replacement: 'Viewsonic'
4465
4611
  model_replacement: '$2'
4466
- - regex: '; *(GTablet.*?)(?: Build|\) AppleWebKit)'
4612
+ - regex: '; {0,2}(GTablet.{0,200}?)(?: Build|\) AppleWebKit)'
4467
4613
  device_replacement: '$1'
4468
4614
  brand_replacement: 'Viewsonic'
4469
4615
  model_replacement: '$1'
@@ -4472,7 +4618,7 @@ device_parsers:
4472
4618
  # vivo
4473
4619
  # @ref: http://vivo.cn/
4474
4620
  #########
4475
- - regex: '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4621
+ - regex: '; {0,2}([Vv]ivo)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4476
4622
  device_replacement: '$1 $2'
4477
4623
  brand_replacement: 'vivo'
4478
4624
  model_replacement: '$2'
@@ -4481,7 +4627,7 @@ device_parsers:
4481
4627
  # Vodafone (Operator Branded Devices)
4482
4628
  # @ref: ??
4483
4629
  #########
4484
- - regex: '(Vodafone) (.*?)(?: Build|\) AppleWebKit)'
4630
+ - regex: '(Vodafone) (.{0,200}?)(?: Build|\) AppleWebKit)'
4485
4631
  device_replacement: '$1 $2'
4486
4632
  brand_replacement: '$1'
4487
4633
  model_replacement: '$2'
@@ -4490,7 +4636,7 @@ device_parsers:
4490
4636
  # Walton
4491
4637
  # @ref: http://www.waltonbd.com/
4492
4638
  #########
4493
- - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
4639
+ - regex: '; {0,2}(?:Walton[ _\-]|)(Primo[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4494
4640
  regex_flag: 'i'
4495
4641
  device_replacement: 'Walton $1'
4496
4642
  brand_replacement: 'Walton'
@@ -4500,7 +4646,7 @@ device_parsers:
4500
4646
  # Wiko
4501
4647
  # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
4502
4648
  #########
4503
- - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\) AppleWebKit)'
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)'
4504
4650
  regex_flag: 'i'
4505
4651
  device_replacement: 'Wiko $1'
4506
4652
  brand_replacement: 'Wiko'
@@ -4510,7 +4656,7 @@ device_parsers:
4510
4656
  # WellcoM
4511
4657
  # @ref: ??
4512
4658
  #########
4513
- - regex: '; *WellcoM-([^;/]+?)(?: Build|\) AppleWebKit)'
4659
+ - regex: '; {0,2}WellcoM-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4514
4660
  device_replacement: 'Wellcom $1'
4515
4661
  brand_replacement: 'Wellcom'
4516
4662
  model_replacement: '$1'
@@ -4528,7 +4674,7 @@ device_parsers:
4528
4674
  # Wolfgang
4529
4675
  # @ref: http://wolfgangmobile.com/
4530
4676
  #########
4531
- - regex: '; *(AT-AS[^;/]+?)(?: Build|\) AppleWebKit)'
4677
+ - regex: '; {0,2}(AT-AS[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4532
4678
  device_replacement: 'Wolfgang $1'
4533
4679
  brand_replacement: 'Wolfgang'
4534
4680
  model_replacement: '$1'
@@ -4537,7 +4683,7 @@ device_parsers:
4537
4683
  # Woxter
4538
4684
  # @ref: http://www.woxter.es/es-es/categories/index
4539
4685
  #########
4540
- - regex: '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\) AppleWebKit)'
4686
+ - regex: '; {0,2}(?:Woxter|Wxt) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4541
4687
  device_replacement: 'Woxter $1'
4542
4688
  brand_replacement: 'Woxter'
4543
4689
  model_replacement: '$1'
@@ -4546,7 +4692,7 @@ device_parsers:
4546
4692
  # Yarvik Zania
4547
4693
  # @ref: http://yarvik.com
4548
4694
  #########
4549
- - 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|\) AppleWebKit)'
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)'
4550
4696
  device_replacement: 'Yarvik $1'
4551
4697
  brand_replacement: 'Yarvik'
4552
4698
  model_replacement: '$1'
@@ -4560,7 +4706,7 @@ device_parsers:
4560
4706
  # M778, M7000, M7000AD, M7000NBD, M7001, M7002, M7002KBD, M777, M767,
4561
4707
  # M789, M799, M769, M757, M755, M753, M752, M739, M729, M723, M712, M727
4562
4708
  #########
4563
- - 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|[;\)])'
4564
4710
  device_replacement: 'Yifang $1$2$3'
4565
4711
  brand_replacement: 'Yifang'
4566
4712
  model_replacement: '$2'
@@ -4569,19 +4715,19 @@ device_parsers:
4569
4715
  # XiaoMi
4570
4716
  # @ref: http://www.xiaomi.com/event/buyphone
4571
4717
  #########
4572
- - 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)/'
4573
4719
  device_replacement: 'XiaoMi $1'
4574
4720
  brand_replacement: 'XiaoMi'
4575
4721
  model_replacement: '$1'
4576
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4722
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4577
4723
  device_replacement: 'XiaoMi $1'
4578
4724
  brand_replacement: 'XiaoMi'
4579
4725
  model_replacement: '$1'
4580
- - regex: '; *(MIX) (Build|MIUI)/'
4726
+ - regex: '; {0,2}(MIX) (Build|MIUI)/'
4581
4727
  device_replacement: 'XiaoMi $1'
4582
4728
  brand_replacement: 'XiaoMi'
4583
4729
  model_replacement: '$1'
4584
- - regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
4730
+ - regex: '; {0,2}((MIX) ([^;/]*)) (Build|MIUI)/'
4585
4731
  device_replacement: 'XiaoMi $1'
4586
4732
  brand_replacement: 'XiaoMi'
4587
4733
  model_replacement: '$1'
@@ -4590,17 +4736,17 @@ device_parsers:
4590
4736
  # Xolo
4591
4737
  # @ref: http://www.xolo.in/
4592
4738
  #########
4593
- - regex: '; *XOLO[ _]([^;/]*tab.*)(?: Build|\) AppleWebKit)'
4739
+ - regex: '; {0,2}XOLO[ _]([^;/]{0,30}tab.{0,30})(?: Build|\) AppleWebKit)'
4594
4740
  regex_flag: 'i'
4595
4741
  device_replacement: 'Xolo $1'
4596
4742
  brand_replacement: 'Xolo'
4597
4743
  model_replacement: '$1'
4598
- - regex: '; *XOLO[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4744
+ - regex: '; {0,2}XOLO[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4599
4745
  regex_flag: 'i'
4600
4746
  device_replacement: 'Xolo $1'
4601
4747
  brand_replacement: 'Xolo'
4602
4748
  model_replacement: '$1'
4603
- - regex: '; *(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4749
+ - regex: '; {0,2}(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4604
4750
  regex_flag: 'i'
4605
4751
  device_replacement: 'Xolo $1'
4606
4752
  brand_replacement: 'Xolo'
@@ -4610,7 +4756,7 @@ device_parsers:
4610
4756
  # Xoro
4611
4757
  # @ref: http://www.xoro.de/produkte/
4612
4758
  #########
4613
- - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4759
+ - regex: '; {0,2}(PAD ?[79]\d+[^;/]{0,50}|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4614
4760
  device_replacement: 'Xoro $1'
4615
4761
  brand_replacement: 'Xoro'
4616
4762
  model_replacement: '$1'
@@ -4619,7 +4765,7 @@ device_parsers:
4619
4765
  # Zopo
4620
4766
  # @ref: http://www.zopomobiles.com/products.html
4621
4767
  #########
4622
- - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4768
+ - regex: '; {0,2}(?:(?:ZOPO|Zopo)[ _]([^;/]{1,100}?)|(ZP ?(?:\d{2}[^;/]{1,100}|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4623
4769
  device_replacement: '$1$2$3'
4624
4770
  brand_replacement: 'Zopo'
4625
4771
  model_replacement: '$1$2$3'
@@ -4628,11 +4774,11 @@ device_parsers:
4628
4774
  # ZiiLabs
4629
4775
  # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
4630
4776
  #########
4631
- - regex: '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4777
+ - regex: '; {0,2}(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4632
4778
  device_replacement: '$1 $2'
4633
4779
  brand_replacement: 'ZiiLabs'
4634
4780
  model_replacement: '$2'
4635
- - regex: '; *(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4781
+ - regex: '; {0,2}(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4636
4782
  device_replacement: '$1 $2'
4637
4783
  brand_replacement: 'ZiiLabs'
4638
4784
  model_replacement: '$2'
@@ -4641,36 +4787,36 @@ device_parsers:
4641
4787
  # ZTE
4642
4788
  # @ref: http://www.ztedevices.com/
4643
4789
  #########
4644
- - 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|\) AppleWebKit)'
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)'
4645
4791
  device_replacement: '$1'
4646
4792
  brand_replacement: 'ZTE'
4647
4793
  model_replacement: '$1'
4648
- - regex: '; *([A-Z]\d+)_USA_[^;]*(?: Build|\) AppleWebKit)'
4794
+ - regex: '; {0,2}([A-Z]\d+)_USA_[^;]{0,200}(?: Build|\) AppleWebKit)'
4649
4795
  device_replacement: '$1'
4650
4796
  brand_replacement: 'ZTE'
4651
4797
  model_replacement: '$1'
4652
- - regex: '; *(SmartTab\d+)[^;]*(?: Build|\) AppleWebKit)'
4798
+ - regex: '; {0,2}(SmartTab\d+)[^;]{0,50}(?: Build|\) AppleWebKit)'
4653
4799
  device_replacement: '$1'
4654
4800
  brand_replacement: 'ZTE'
4655
4801
  model_replacement: '$1'
4656
- - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4802
+ - regex: '; {0,2}(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4657
4803
  device_replacement: 'ZTE Blade$1'
4658
4804
  brand_replacement: 'ZTE'
4659
4805
  model_replacement: 'Blade$1'
4660
- - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4806
+ - regex: '; {0,2}(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4661
4807
  device_replacement: 'ZTE Skate$1'
4662
4808
  brand_replacement: 'ZTE'
4663
4809
  model_replacement: 'Skate$1'
4664
- - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4810
+ - regex: '; {0,2}(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4665
4811
  device_replacement: '$1$2'
4666
4812
  brand_replacement: 'ZTE'
4667
4813
  model_replacement: '$1$2'
4668
- - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\) AppleWebKit)'
4814
+ - regex: '; {0,2}(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4669
4815
  device_replacement: 'ZTE $1'
4670
4816
  brand_replacement: 'ZTE'
4671
4817
  model_replacement: '$1'
4672
4818
  # operator specific
4673
- - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\) AppleWebKit)'
4819
+ - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]{0,200}?)(?: Build|\) AppleWebKit)'
4674
4820
  device_replacement: '$1 $2'
4675
4821
  brand_replacement: 'ZTE'
4676
4822
  model_replacement: '$1 $2'
@@ -4679,7 +4825,7 @@ device_parsers:
4679
4825
  device_replacement: '$1'
4680
4826
  brand_replacement: 'ZTE'
4681
4827
  model_replacement: '$1'
4682
- - regex: '; *(vp9plus)\)'
4828
+ - regex: '; {0,2}(vp9plus)\)'
4683
4829
  device_replacement: '$1'
4684
4830
  brand_replacement: 'ZTE'
4685
4831
  model_replacement: '$1'
@@ -4739,7 +4885,7 @@ device_parsers:
4739
4885
  device_replacement: 'Kindle Fire HDX 8.9" 4G'
4740
4886
  brand_replacement: 'Amazon'
4741
4887
  model_replacement: 'Kindle Fire HDX 8.9" 4G'
4742
- - regex: '; ?Amazon ([^;/]+) Build\b'
4888
+ - regex: '; ?Amazon ([^;/]{1,100}) Build\b'
4743
4889
  device_replacement: '$1'
4744
4890
  brand_replacement: 'Amazon'
4745
4891
  model_replacement: '$1'
@@ -4762,22 +4908,22 @@ device_parsers:
4762
4908
 
4763
4909
  #########
4764
4910
  # Devices from chinese manufacturer(s)
4765
- # @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}
4766
4912
  #########
4767
- - regex: '(sprd)\-([^/]+)/'
4913
+ - regex: '(sprd)\-([^/]{1,50})/'
4768
4914
  device_replacement: '$1 $2'
4769
4915
  brand_replacement: '$1'
4770
4916
  model_replacement: '$2'
4771
4917
  # @ref: http://eshinechina.en.alibaba.com/
4772
- - regex: '; *(H\d{2}00\+?) Build'
4918
+ - regex: '; {0,2}(H\d{2}00\+?) Build'
4773
4919
  device_replacement: '$1'
4774
4920
  brand_replacement: 'Hero'
4775
4921
  model_replacement: '$1'
4776
- - regex: '; *(iphone|iPhone5) Build/'
4922
+ - regex: '; {0,2}(iphone|iPhone5) Build/'
4777
4923
  device_replacement: 'Xianghe $1'
4778
4924
  brand_replacement: 'Xianghe'
4779
4925
  model_replacement: '$1'
4780
- - 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/'
4781
4927
  device_replacement: 'Xianghe $1'
4782
4928
  brand_replacement: 'Xianghe'
4783
4929
  model_replacement: '$1'
@@ -4799,7 +4945,7 @@ device_parsers:
4799
4945
  #########
4800
4946
  # Alcatel Windows Phones
4801
4947
  #########
4802
- - 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}([^;,\)]+)'
4803
4949
  device_replacement: 'Alcatel $1'
4804
4950
  brand_replacement: 'Alcatel'
4805
4951
  model_replacement: '$1'
@@ -4807,8 +4953,7 @@ device_parsers:
4807
4953
  #########
4808
4954
  # Asus Windows Phones
4809
4955
  #########
4810
- #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4811
- - 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}([^;,\)]+)'
4812
4957
  device_replacement: 'Asus $1'
4813
4958
  brand_replacement: 'Asus'
4814
4959
  model_replacement: '$1'
@@ -4816,7 +4961,7 @@ device_parsers:
4816
4961
  #########
4817
4962
  # Dell Windows Phones
4818
4963
  #########
4819
- - 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}([^;,\)]+)'
4820
4965
  device_replacement: 'Dell $1'
4821
4966
  brand_replacement: 'Dell'
4822
4967
  model_replacement: '$1'
@@ -4824,7 +4969,7 @@ device_parsers:
4824
4969
  #########
4825
4970
  # HTC Windows Phones
4826
4971
  #########
4827
- - 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|)([^;,\)]+)'
4828
4973
  device_replacement: 'HTC $1'
4829
4974
  brand_replacement: 'HTC'
4830
4975
  model_replacement: '$1'
@@ -4832,7 +4977,7 @@ device_parsers:
4832
4977
  #########
4833
4978
  # Huawei Windows Phones
4834
4979
  #########
4835
- - 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 |)([^;,\)]+)'
4836
4981
  device_replacement: 'Huawei $1'
4837
4982
  brand_replacement: 'Huawei'
4838
4983
  model_replacement: '$1'
@@ -4840,7 +4985,7 @@ device_parsers:
4840
4985
  #########
4841
4986
  # LG Windows Phones
4842
4987
  #########
4843
- - 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[ \-]|)([^;,\)]+)'
4844
4989
  device_replacement: 'LG $1'
4845
4990
  brand_replacement: 'LG'
4846
4991
  model_replacement: '$1'
@@ -4848,15 +4993,15 @@ device_parsers:
4848
4993
  #########
4849
4994
  # Noka Windows Phones
4850
4995
  #########
4851
- - 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}[^;\)]*)'
4852
4997
  device_replacement: 'Lumia $1'
4853
4998
  brand_replacement: 'Nokia'
4854
4999
  model_replacement: 'Lumia $1'
4855
- - 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,})'
4856
5001
  device_replacement: 'Nokia $1'
4857
5002
  brand_replacement: 'Nokia'
4858
5003
  model_replacement: '$1'
4859
- - 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 ?|)([^;\)]+)'
4860
5005
  device_replacement: 'Nokia $1'
4861
5006
  brand_replacement: 'Nokia'
4862
5007
  model_replacement: '$1'
@@ -4864,7 +5009,7 @@ device_parsers:
4864
5009
  #########
4865
5010
  # Microsoft Windows Phones
4866
5011
  #########
4867
- - 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}([^;,\)]+)'
4868
5013
  device_replacement: 'Microsoft $1'
4869
5014
  brand_replacement: 'Microsoft'
4870
5015
  model_replacement: '$1'
@@ -4872,7 +5017,7 @@ device_parsers:
4872
5017
  #########
4873
5018
  # Samsung Windows Phones
4874
5019
  #########
4875
- - 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 |)([^;,\.\)]+)'
4876
5021
  device_replacement: 'Samsung $1'
4877
5022
  brand_replacement: 'Samsung'
4878
5023
  model_replacement: '$1'
@@ -4880,7 +5025,7 @@ device_parsers:
4880
5025
  #########
4881
5026
  # Toshiba Windows Phones
4882
5027
  #########
4883
- - 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}([^;,\)]+)'
4884
5029
  device_replacement: 'Toshiba $1'
4885
5030
  brand_replacement: 'Toshiba'
4886
5031
  model_replacement: '$1'
@@ -4888,7 +5033,7 @@ device_parsers:
4888
5033
  #########
4889
5034
  # Generic Windows Phones
4890
5035
  #########
4891
- - 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}([^;,\)]+)'
4892
5037
  device_replacement: '$1 $2'
4893
5038
  brand_replacement: '$1'
4894
5039
  model_replacement: '$2'
@@ -4900,7 +5045,7 @@ device_parsers:
4900
5045
  #########
4901
5046
  # Samsung Bada Phones
4902
5047
  #########
4903
- - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]+).* Bada/'
5048
+ - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]{1,50}).{0,200} Bada/'
4904
5049
  device_replacement: 'Samsung $1'
4905
5050
  brand_replacement: 'Samsung'
4906
5051
  model_replacement: '$1'
@@ -4908,11 +5053,11 @@ device_parsers:
4908
5053
  #########
4909
5054
  # Firefox OS
4910
5055
  #########
4911
- - 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/'
4912
5057
  device_replacement: 'Alcatel $1 $2 $3'
4913
5058
  brand_replacement: 'Alcatel'
4914
5059
  model_replacement: 'One Touch $3'
4915
- - regex: '\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5060
+ - regex: '\(Mobile; (?:ZTE([^;]{1,200})|(OpenC)); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4916
5061
  device_replacement: 'ZTE $1$2'
4917
5062
  brand_replacement: 'ZTE'
4918
5063
  model_replacement: '$1$2'
@@ -4920,15 +5065,15 @@ device_parsers:
4920
5065
  #########
4921
5066
  # KaiOS
4922
5067
  #########
4923
- - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KaiOS/'
5068
+ - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/[^\/]{1,200} KaiOS/'
4924
5069
  device_replacement: 'Alcatel $1'
4925
5070
  brand_replacement: 'Alcatel'
4926
5071
  model_replacement: '$1'
4927
- - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]+)\/.+;.+rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5072
+ - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]{1,100})\/.{0,100};.{0,100}rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4928
5073
  device_replacement: 'LYF $1'
4929
5074
  brand_replacement: 'LYF'
4930
5075
  model_replacement: '$1'
4931
- - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]+)_.+; rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5076
+ - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]{1,100})_.{1,100}; rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4932
5077
  device_replacement: 'Nokia $1'
4933
5078
  brand_replacement: 'Nokia'
4934
5079
  model_replacement: '$1'
@@ -4941,7 +5086,7 @@ device_parsers:
4941
5086
  device_replacement: 'Nokia $1'
4942
5087
  brand_replacement: 'Nokia'
4943
5088
  model_replacement: '$1$2'
4944
- - 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\-]+))'
4945
5090
  device_replacement: 'Nokia $1$2$3'
4946
5091
  brand_replacement: 'Nokia'
4947
5092
  model_replacement: '$1$2$3'
@@ -4950,12 +5095,12 @@ device_parsers:
4950
5095
  brand_replacement: 'Nokia'
4951
5096
  model_replacement: 'Lumia $1'
4952
5097
  # UCWEB Browser on Symbian
4953
- - 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}?)\)'
4954
5099
  device_replacement: '$1 $2'
4955
5100
  brand_replacement: '$1'
4956
5101
  model_replacement: '$2'
4957
5102
  # Nokia Symbian
4958
- - regex: '\(Symbian(?:/3|); U; ([^;]+);'
5103
+ - regex: '\(Symbian(?:/3|); U; ([^;]{1,200});'
4959
5104
  device_replacement: 'Nokia $1'
4960
5105
  brand_replacement: 'Nokia'
4961
5106
  model_replacement: '$1'
@@ -4968,7 +5113,7 @@ device_parsers:
4968
5113
  device_replacement: 'BlackBerry $1'
4969
5114
  brand_replacement: 'BlackBerry'
4970
5115
  model_replacement: '$1'
4971
- - regex: 'Play[Bb]ook.+RIM Tablet OS'
5116
+ - regex: 'Play[Bb]ook.{1,200}RIM Tablet OS'
4972
5117
  device_replacement: 'BlackBerry Playbook'
4973
5118
  brand_replacement: 'BlackBerry'
4974
5119
  model_replacement: 'Playbook'
@@ -5000,7 +5145,7 @@ device_parsers:
5000
5145
  device_replacement: 'Palm Treo $1'
5001
5146
  brand_replacement: 'Palm'
5002
5147
  model_replacement: 'Treo $1'
5003
- - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
5148
+ - regex: 'webOS.{0,200}(P160U(?:NA|))/(\d+).(\d+)'
5004
5149
  device_replacement: 'HP Veer'
5005
5150
  brand_replacement: 'HP'
5006
5151
  model_replacement: 'Veer'
@@ -5008,7 +5153,7 @@ device_parsers:
5008
5153
  device_replacement: 'HP TouchPad'
5009
5154
  brand_replacement: 'HP'
5010
5155
  model_replacement: 'TouchPad'
5011
- - regex: 'HPiPAQ([A-Za-z0-9]+)/\d+.\d+'
5156
+ - regex: 'HPiPAQ([A-Za-z0-9]{1,20})/\d+\.\d+'
5012
5157
  device_replacement: 'HP iPAQ $1'
5013
5158
  brand_replacement: 'HP'
5014
5159
  model_replacement: 'iPAQ $1'
@@ -5076,18 +5221,18 @@ device_parsers:
5076
5221
  brand_replacement: 'Apple'
5077
5222
  model_replacement: 'iPhone'
5078
5223
  # @note: desktop applications show device info
5079
- - 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+)'
5080
5225
  device_replacement: '$1$2,$3'
5081
5226
  brand_replacement: 'Apple'
5082
5227
  model_replacement: '$1$2,$3'
5083
5228
  # @note: newer desktop applications don't show device info
5084
5229
  # This is here so as to not have them recorded as iOS-Device
5085
- - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5230
+ - regex: 'CFNetwork/.{0,100} Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5086
5231
  device_replacement: 'Mac'
5087
5232
  brand_replacement: 'Apple'
5088
5233
  model_replacement: 'Mac'
5089
5234
  # @note: iOS applications do not show device info
5090
- - regex: 'CFNetwork/.* Darwin/\d'
5235
+ - regex: 'CFNetwork/.{0,100} Darwin/\d'
5091
5236
  device_replacement: 'iOS-Device'
5092
5237
  brand_replacement: 'Apple'
5093
5238
  model_replacement: 'iOS-Device'
@@ -5131,7 +5276,7 @@ device_parsers:
5131
5276
  device_replacement: 'Asus $1'
5132
5277
  brand_replacement: 'Asus'
5133
5278
  model_replacement: '$1'
5134
- - 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]+)'
5135
5280
  device_replacement: 'Asus $1'
5136
5281
  brand_replacement: 'Asus'
5137
5282
  model_replacement: '$1'
@@ -5164,11 +5309,11 @@ device_parsers:
5164
5309
  device_replacement: 'DoCoMo $1'
5165
5310
  brand_replacement: 'DoCoMo'
5166
5311
  model_replacement: '$1'
5167
- - regex: '([A-Za-z0-9]+)_W;FOMA'
5312
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30})_W;FOMA'
5168
5313
  device_replacement: 'DoCoMo $1'
5169
5314
  brand_replacement: 'DoCoMo'
5170
5315
  model_replacement: '$1'
5171
- - regex: '([A-Za-z0-9]+);FOMA'
5316
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30});FOMA'
5172
5317
  device_replacement: 'DoCoMo $1'
5173
5318
  brand_replacement: 'DoCoMo'
5174
5319
  model_replacement: '$1'
@@ -5176,7 +5321,7 @@ device_parsers:
5176
5321
  ##########
5177
5322
  # htc
5178
5323
  ##########
5179
- - 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|[;/\(\)]|$)'
5180
5325
  device_replacement: 'HTC $1'
5181
5326
  brand_replacement: 'HTC'
5182
5327
  model_replacement: '$1'
@@ -5237,18 +5382,18 @@ device_parsers:
5237
5382
  device_replacement: '$1'
5238
5383
  brand_replacement: '$2'
5239
5384
  model_replacement: '$3'
5240
- - 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});?'
5241
5386
  device_replacement: '$1'
5242
5387
  brand_replacement: 'Thomson'
5243
5388
  model_replacement: '$4'
5244
- - 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});'
5245
5390
  device_replacement: '$1'
5246
5391
  brand_replacement: '$2'
5247
5392
  model_replacement: '$3'
5248
5393
  - regex: '(HbbTV)/1\.1\.1 \(;;;;;\) Maple_2011'
5249
5394
  device_replacement: '$1'
5250
5395
  brand_replacement: 'Samsung'
5251
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]*)|([^;]+)) ?; ?([^;]{0,30})'
5396
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]{0,200})|([^;]{1,200})) ?; ?([^;]{0,30})'
5252
5397
  device_replacement: '$1'
5253
5398
  brand_replacement: '$2$3'
5254
5399
  model_replacement: '$4'
@@ -5258,7 +5403,7 @@ device_parsers:
5258
5403
  ##########
5259
5404
  # LGE NetCast TV
5260
5405
  ##########
5261
- - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5406
+ - regex: 'LGE; (?:Media\/|)([^;]{0,200});[^;]{0,200};[^;]{0,200};?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5262
5407
  device_replacement: 'NetCast$2'
5263
5408
  brand_replacement: 'LG'
5264
5409
  model_replacement: '$1'
@@ -5266,11 +5411,11 @@ device_parsers:
5266
5411
  ##########
5267
5412
  # InettvBrowser
5268
5413
  ##########
5269
- - 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}\)'
5270
5415
  device_replacement: 'Inettv'
5271
5416
  brand_replacement: '$1'
5272
5417
  model_replacement: '$2'
5273
- - 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}\)'
5274
5419
  device_replacement: 'Inettv'
5275
5420
  brand_replacement: 'Generic_Inettv'
5276
5421
  model_replacement: '$1'
@@ -5307,7 +5452,7 @@ device_parsers:
5307
5452
  device_replacement: 'Microsoft $1'
5308
5453
  brand_replacement: 'Microsoft'
5309
5454
  model_replacement: '$1'
5310
- - regex: '(?:MSIE|XBMC).*\b(Xbox)\b'
5455
+ - regex: '(?:MSIE|XBMC).{0,200}\b(Xbox)\b'
5311
5456
  device_replacement: '$1'
5312
5457
  brand_replacement: 'Microsoft'
5313
5458
  model_replacement: '$1'
@@ -5368,12 +5513,12 @@ device_parsers:
5368
5513
  # Samsung
5369
5514
  ##########
5370
5515
  # Samsung Smart-TV
5371
- - regex: '(SMART-TV); .* Tizen '
5516
+ - regex: '(SMART-TV); .{0,200} Tizen '
5372
5517
  device_replacement: 'Samsung $1'
5373
5518
  brand_replacement: 'Samsung'
5374
5519
  model_replacement: '$1'
5375
5520
  # Samsung Symbian Devices
5376
- - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
5521
+ - regex: 'SymbianOS/9\.\d.{0,200} Samsung[/\-]([A-Za-z0-9 \-]+)'
5377
5522
  device_replacement: 'Samsung $1'
5378
5523
  brand_replacement: 'Samsung'
5379
5524
  model_replacement: '$1'
@@ -5381,7 +5526,7 @@ device_parsers:
5381
5526
  device_replacement: '$1 $2$3'
5382
5527
  brand_replacement: '$1'
5383
5528
  model_replacement: '$2-$3'
5384
- - regex: 'SAMSUNG-ANDROID-MMS/([^;/]+)'
5529
+ - regex: 'SAMSUNG-ANDROID-MMS/([^;/]{1,100})'
5385
5530
  device_replacement: '$1'
5386
5531
  brand_replacement: 'Samsung'
5387
5532
  model_replacement: '$1'
@@ -5428,7 +5573,7 @@ device_parsers:
5428
5573
  ##########
5429
5574
  # Sony
5430
5575
  ##########
5431
- - regex: 'Android [^;]+; ([^ ]+) (Sony)/'
5576
+ - regex: 'Android [^;]{1,200}; ([^ ]+) (Sony)/'
5432
5577
  device_replacement: '$2 $1'
5433
5578
  brand_replacement: '$2'
5434
5579
  model_replacement: '$1'
@@ -5462,33 +5607,33 @@ device_parsers:
5462
5607
  #########
5463
5608
  # Android General Device Matching (far from perfect)
5464
5609
  #########
5465
- - 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[/ ]|\))'
5466
5611
  brand_replacement: 'Generic_Android'
5467
5612
  model_replacement: '$1'
5468
- - 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[/ ]|\))'
5469
5614
  brand_replacement: 'Generic_Android'
5470
5615
  model_replacement: '$1'
5471
- - 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[/ ]|\))'
5472
5617
  brand_replacement: 'Generic_Android'
5473
5618
  model_replacement: '$1'
5474
- - 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[/ ]|\))'
5475
5620
  brand_replacement: 'Generic_Android'
5476
5621
  model_replacement: '$1'
5477
5622
  # No build info at all - "Build" follows locale immediately
5478
- - 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[/ ]|\))'
5479
5624
  device_replacement: 'Generic Smartphone'
5480
5625
  brand_replacement: 'Generic'
5481
5626
  model_replacement: 'Smartphone'
5482
- - 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[/ ]|\))'
5483
5628
  brand_replacement: 'Generic_Android'
5484
5629
  model_replacement: '$1'
5485
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Mobile Safari'
5630
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Mobile Safari'
5486
5631
  brand_replacement: 'Generic_Android'
5487
5632
  model_replacement: '$1'
5488
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Safari'
5633
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Safari'
5489
5634
  brand_replacement: 'Generic_Android_Tablet'
5490
5635
  model_replacement: '$1'
5491
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\))'
5636
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\))'
5492
5637
  brand_replacement: 'Generic_Android'
5493
5638
  model_replacement: '$1'
5494
5639
 
@@ -5513,7 +5658,7 @@ device_parsers:
5513
5658
  ##########
5514
5659
  # Generic Tablet
5515
5660
  ##########
5516
- - 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))'
5517
5662
  regex_flag: 'i'
5518
5663
  device_replacement: 'Generic Tablet'
5519
5664
  brand_replacement: 'Generic'
@@ -5522,7 +5667,7 @@ device_parsers:
5522
5667
  ##########
5523
5668
  # Generic Smart Phone
5524
5669
  ##########
5525
- - 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)'
5526
5671
  device_replacement: 'Generic Smartphone'
5527
5672
  brand_replacement: 'Generic'
5528
5673
  model_replacement: 'Smartphone'
@@ -5535,7 +5680,7 @@ device_parsers:
5535
5680
  ##########
5536
5681
  # Spiders (this is a hack...)
5537
5682
  ##########
5538
- - 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|OgScrper)'
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)'
5539
5684
  regex_flag: 'i'
5540
5685
  device_replacement: 'Spider'
5541
5686
  brand_replacement: 'Spider'