user_agent_parser 2.7.0 → 2.16.0

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