user_agent_parser 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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'