user_agent_parser 2.7.0 → 2.10.0

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