user_agent_parser 2.7.0 → 2.16.0

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