user_agent_parser 2.5.2 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,17 +1,63 @@
1
1
  user_agent_parsers:
2
2
  #### SPECIAL CASES TOP ####
3
3
 
4
+ # ESRI Server products
5
+ - regex: '(GeoEvent Server) (\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
6
+
7
+ # ESRI ArcGIS Desktop Products
8
+ - regex: '(ArcGIS Pro)(?: (\d+)\.(\d+)\.([^ ]+)|)'
9
+
10
+ - regex: 'ArcGIS Client Using WinInet'
11
+ family_replacement: 'ArcMap'
12
+
13
+ - regex: '(OperationsDashboard)-(?:Windows)-(\d+)\.(\d+)\.(\d+)'
14
+ family_replacement: 'Operations Dashboard for ArcGIS'
15
+
16
+ - regex: '(arcgisearth)/(\d+)\.(\d+)(?:\.(\d+)|)'
17
+ family_replacement: 'ArcGIS Earth'
18
+
19
+ - regex: 'com.esri.(earth).phone/(\d+)\.(\d+)(?:\.(\d+)|)'
20
+ family_replacement: 'ArcGIS Earth'
21
+
22
+ # ESRI ArcGIS Mobile Products
23
+ - regex: '(arcgis-explorer)/(\d+)\.(\d+)\.(\d+)'
24
+ family_replacement: 'Explorer for ArcGIS'
25
+
26
+ - regex: 'arcgis-(collector|aurora)/(\d+)\.(\d+)\.(\d+)'
27
+ family_replacement: 'Collector for ArcGIS'
28
+
29
+ - regex: '(arcgis-workforce)/(\d+)\.(\d+)\.(\d+)'
30
+ family_replacement: 'Workforce for ArcGIS'
31
+
32
+ - regex: '(Collector|Explorer|Workforce)-(?:Android|iOS)-(\d+)\.(\d+)(?:\.(\d+)|)'
33
+ family_replacement: '$1 for ArcGIS'
34
+
35
+ - regex: '(Explorer|Collector)/(\d+) CFNetwork'
36
+ family_replacement: '$1 for ArcGIS'
37
+
38
+ # ESRI ArcGIS Runtimes
39
+ - regex: 'ArcGISRuntime-(Android|iOS|NET|Qt)/(\d+)\.(\d+)(?:\.(\d+)|)'
40
+ family_replacement: 'ArcGIS Runtime SDK for $1'
41
+
42
+ - regex: 'ArcGIS\.?(iOS|Android|NET|Qt)(?:-|\.)(\d+)\.(\d+)(?:\.(\d+)|)'
43
+ family_replacement: 'ArcGIS Runtime SDK for $1'
44
+
45
+ - regex: 'ArcGIS\.Runtime\.(Qt)\.(\d+)\.(\d+)(?:\.(\d+)|)'
46
+ family_replacement: 'ArcGIS Runtime SDK for $1'
47
+
4
48
  # CFNetwork Podcast catcher Applications
49
+ - regex: '^(Luminary)[Stage]+/(\d+) CFNetwork'
5
50
  - regex: '(ESPN)[%20| ]+Radio/(\d+)\.(\d+)\.(\d+) CFNetwork'
6
51
  - regex: '(Antenna)/(\d+) CFNetwork'
7
52
  family_replacement: 'AntennaPod'
8
53
  - regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
9
54
  - regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
10
- - regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
11
- - regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
12
- - 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'
13
58
 
14
59
  # Podcast catchers
60
+ - regex: '^(Luminary)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
15
61
  - regex: '(espn\.go)'
16
62
  family_replacement: 'ESPN'
17
63
  - regex: '(espnradio\.com)'
@@ -48,6 +94,10 @@ user_agent_parsers:
48
94
  - regex: '(Tableau)/(\d+)\.(\d+)'
49
95
  family_replacement: 'Tableau'
50
96
 
97
+ # Adobe CreativeCloud
98
+ - regex: 'AppleWebKit/\d{1,10}\.\d{1,10}.{0,200} Safari.{0,200} (CreativeCloud)/(\d+)\.(\d+).(\d+)'
99
+ family_replacement: 'Adobe CreativeCloud'
100
+
51
101
  # Salesforce
52
102
  - regex: '(Salesforce)(?:.)\/(\d+)\.(\d?)'
53
103
 
@@ -60,7 +110,7 @@ user_agent_parsers:
60
110
  family_replacement: 'FacebookBot'
61
111
 
62
112
  # Google Plus
63
- - regex: 'Google.*/\+/web/snippet'
113
+ - regex: 'Google.{0,50}/\+/web/snippet'
64
114
  family_replacement: 'GooglePlusBot'
65
115
 
66
116
  # Gmail
@@ -73,52 +123,65 @@ user_agent_parsers:
73
123
 
74
124
  # Twitter
75
125
  - regex: '(Twitterbot)/(\d+)\.(\d+)'
76
- family_replacement: 'TwitterBot'
126
+ family_replacement: 'Twitterbot'
77
127
 
78
- # Bots Pattern '/name-0.0'
128
+ # Bots Pattern 'name/0.0.0'
79
129
  - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
80
- # Bots Pattern 'name/0.0'
81
- - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
130
+ # Bots Pattern 'name/0.0.0'
131
+ - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|Pandora|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
82
132
 
83
133
  # MSIECrawler
84
- - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
134
+ - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.{0,200} MSIECrawler'
85
135
  family_replacement: 'MSIECrawler'
86
136
 
87
137
  # DAVdroid
88
138
  - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
89
139
 
90
140
  # Downloader ...
91
- - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
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+)|)|)'
92
142
 
93
143
  # Pinterestbot
94
144
  - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
95
145
  family_replacement: 'Pinterestbot'
96
146
 
97
147
  # Bots
98
- - 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|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)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
148
+ - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PHPCrawl|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
99
149
 
100
150
  # AWS S3 Clients
101
151
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
102
- - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
152
+ - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\d{1,2}|core)))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
153
+
154
+ # SAFE FME
155
+ - regex: '(FME)\/(\d+\.\d+)\.(\d+)\.(\d+)'
156
+
157
+ # QGIS
158
+ - regex: '(QGIS)\/(\d)\.?0?(\d{1,2})\.?0?(\d{1,2})'
159
+
160
+ # JOSM
161
+ - regex: '(JOSM)/(\d+)\.(\d+)'
162
+
163
+ # Tygron Platform
164
+ - regex: '(Tygron Platform) \((\d+)\.(\d+)\.(\d+(?:\.\d+| RC \d+\.\d+))'
103
165
 
104
166
  # Facebook
105
167
  # Must come before "Bots General matcher" to catch OrangeBotswana
106
168
  # Facebook Messenger must go before Facebook
107
- - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
169
+ - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
170
+
108
171
  family_replacement: 'Facebook Messenger'
109
172
  # Facebook
110
- - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
+ - regex: '\[FB.{0,300};(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
111
174
  family_replacement: 'Facebook'
112
175
  # Sometimes Facebook does not specify a version (FBAV)
113
- - regex: '\[FB.*;'
176
+ - regex: '\[FB.{0,300};'
114
177
  family_replacement: 'Facebook'
115
178
 
116
179
  # Bots General matcher 'name/0.0'
117
- - regex: '(?:\/[A-Za-z0-9\.]+|) {0,5}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
180
+ - regex: '^.{0,200}?(?:\/[A-Za-z0-9\.]{0,50}|) {0,2}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
118
181
  # Bots containing bot(but not CUBOT)
119
- - regex: '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
182
+ - regex: '^.{0,200}?((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
120
183
  # Bots containing spider|scrape|Crawl
121
- - regex: '((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
184
+ - regex: '^.{0,200}?((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
122
185
 
123
186
  # HbbTV standard defines what features the browser should understand.
124
187
  # but it's like targeting "HTML5 browsers", effective browser support depends on the model
@@ -134,18 +197,28 @@ user_agent_parsers:
134
197
 
135
198
  # Social Networks (non-Facebook)
136
199
  # Pinterest
137
- - regex: '\[(Pinterest)/[^\]]+\]'
200
+ - regex: '\[(Pinterest)/[^\]]{1,50}\]'
138
201
  - regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
139
202
  # Instagram app
140
- - regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
203
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Instagram).(\d+)\.(\d+)\.(\d+)'
141
204
  # Flipboard app
142
- - regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard).(\d+)\.(\d+)\.(\d+)'
143
206
  # Flipboard-briefing app
144
- - regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
145
208
  # Onefootball app
146
- - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
147
210
  # Snapchat
148
211
  - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
212
+ # Twitter
213
+ - regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
214
+ family_replacement: 'Twitter'
215
+
216
+ # aspiegel.com spider (owned by Huawei)
217
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
218
+ family_replacement: 'Spider'
219
+
220
+ - regex: 'AspiegelBot'
221
+ family_replacement: 'Spider'
149
222
 
150
223
  # Basilisk
151
224
  - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
@@ -162,7 +235,7 @@ user_agent_parsers:
162
235
  family_replacement: 'Firefox Mobile'
163
236
  - regex: '(Fennec)/(\d+)\.(\d+)'
164
237
  family_replacement: 'Firefox Mobile'
165
- - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
238
+ - regex: '(?:Mobile|Tablet);.{0,200}(Firefox)/(\d+)\.(\d+)'
166
239
  family_replacement: 'Firefox Mobile'
167
240
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
168
241
  family_replacement: 'Firefox ($1)'
@@ -176,7 +249,7 @@ user_agent_parsers:
176
249
  family_replacement: 'Firefox Beta'
177
250
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
178
251
  family_replacement: 'Firefox ($1)'
179
- - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
252
+ - regex: '(Firefox).{0,200}Tablet browser (\d+)\.(\d+)\.(\d+)'
180
253
  family_replacement: 'MicroB'
181
254
  - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
182
255
  - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
@@ -208,24 +281,24 @@ user_agent_parsers:
208
281
 
209
282
  # Opera will stop at 9.80 and hide the real version in the Version string.
210
283
  # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
211
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
284
+ - regex: '(Opera Tablet).{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
212
285
  - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
213
- - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
286
+ - regex: '(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\d+)\.(\d+)'
214
287
  family_replacement: 'Opera Mobile'
215
- - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
288
+ - regex: '(Opera)/(\d+)\.(\d+).{1,100}Opera Mobi'
216
289
  family_replacement: 'Opera Mobile'
217
- - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
290
+ - regex: 'Opera Mobi.{1,100}(Opera)(?:/|\s+)(\d+)\.(\d+)'
218
291
  family_replacement: 'Opera Mobile'
219
292
  - regex: 'Opera Mobi'
220
293
  family_replacement: 'Opera Mobile'
221
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
294
+ - regex: '(Opera)/9.80.{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
222
295
 
223
296
  # Opera 14 for Android uses a WebKit render engine.
224
- - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
297
+ - regex: '(?:Mobile Safari).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
225
298
  family_replacement: 'Opera Mobile'
226
299
 
227
300
  # Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
228
- - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
301
+ - regex: '(?:Chrome).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
229
302
  family_replacement: 'Opera'
230
303
 
231
304
  # Opera Coast
@@ -237,7 +310,7 @@ user_agent_parsers:
237
310
  family_replacement: 'Opera Mini'
238
311
 
239
312
  # Opera Neon
240
- - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
313
+ - regex: 'Chrome/.{1,200}( MMS)/(\d+).(\d+).(\d+)'
241
314
  family_replacement: 'Opera Neon'
242
315
 
243
316
  # Palm WebOS looks a lot like Safari.
@@ -284,7 +357,7 @@ user_agent_parsers:
284
357
 
285
358
  - regex: '(Symphony) (\d+).(\d+)'
286
359
 
287
- - regex: 'PLAYSTATION 3.+WebKit'
360
+ - regex: 'PLAYSTATION 3.{1,200}WebKit'
288
361
  family_replacement: 'NetFront NX'
289
362
  - regex: 'PLAYSTATION 3'
290
363
  family_replacement: 'NetFront'
@@ -293,7 +366,7 @@ user_agent_parsers:
293
366
  - regex: '(PlayStation Vita)'
294
367
  family_replacement: 'NetFront NX'
295
368
 
296
- - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
369
+ - regex: 'AppleWebKit.{1,200} (NX)/(\d+)\.(\d+)\.(\d+)'
297
370
  family_replacement: 'NetFront NX'
298
371
  - regex: '(Nintendo 3DS)'
299
372
  family_replacement: 'NetFront NX'
@@ -306,7 +379,9 @@ user_agent_parsers:
306
379
  - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
307
380
 
308
381
  # Edge Mobile
309
- - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
382
+ - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
383
+ family_replacement: 'Edge Mobile'
384
+ - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
310
385
  family_replacement: 'Edge Mobile'
311
386
 
312
387
  # Samsung Internet (based on Chrome, but lacking some features)
@@ -347,14 +422,34 @@ user_agent_parsers:
347
422
  - regex: '(Mint Browser)/(\d+)\.(\d+)\.(\d+)'
348
423
  family_replacement: 'Mint Browser'
349
424
 
425
+ # TopBuzz Android must go before Chrome Mobile WebView
426
+ - regex: '(TopBuzz)/(\d+).(\d+).(\d+)'
427
+ family_replacement: 'TopBuzz'
428
+
350
429
  # Google Search App on Android, eg:
351
- - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
430
+ - regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
352
431
  family_replacement: 'Google'
353
432
 
433
+ # QQ Browsers
434
+ - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
435
+ family_replacement: 'QQ Browser Mini'
436
+ - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
437
+ family_replacement: 'QQ Browser Mobile'
438
+ - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
439
+ family_replacement: 'QQ Browser'
440
+
441
+ # DuckDuckGo
442
+ - regex: 'Mobile.{0,200}(DuckDuckGo)/(\d+)'
443
+ family_replacement: 'DuckDuckGo Mobile'
444
+
445
+ # Tenta Browser
446
+ - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)'
447
+ family_replacement: 'Tenta Browser'
448
+
354
449
  # Chrome Mobile
355
- - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
450
+ - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
356
451
  family_replacement: 'Chrome Mobile WebView'
357
- - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
452
+ - regex: '; wv\).{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
358
453
  family_replacement: 'Chrome Mobile WebView'
359
454
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
360
455
  family_replacement: 'Chrome Mobile'
@@ -362,7 +457,7 @@ user_agent_parsers:
362
457
  family_replacement: 'Chrome Mobile iOS'
363
458
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
364
459
  family_replacement: 'Chrome Mobile'
365
- - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
460
+ - regex: ' Mobile .{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
366
461
  family_replacement: 'Chrome Mobile'
367
462
 
368
463
  # Chrome Frame must come before MSIE.
@@ -377,18 +472,13 @@ user_agent_parsers:
377
472
  - regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
378
473
  family_replacement: 'Sogou Explorer'
379
474
 
380
- # QQ Browsers
381
- - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
382
- family_replacement: 'QQ Browser Mini'
383
- - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
384
- family_replacement: 'QQ Browser Mobile'
385
- - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
386
- family_replacement: 'QQ Browser'
387
-
388
475
  # Rackspace Monitoring
389
476
  - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
390
477
  family_replacement: 'RackspaceBot'
391
478
 
479
+ # PRTG Network Monitoring
480
+ - regex: '(PRTG Network Monitor)'
481
+
392
482
  # PyAMF
393
483
  - regex: '(PyAMF)/(\d+)\.(\d+)\.(\d+)'
394
484
 
@@ -397,7 +487,7 @@ user_agent_parsers:
397
487
  family_replacement: 'Yandex Browser'
398
488
 
399
489
  # Mail.ru Amigo/Internet Browser (Chromium-based)
400
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
490
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME'
401
491
  family_replacement: 'Mail.ru Chromium Browser'
402
492
 
403
493
  # AOL Browser (IE-based)
@@ -417,10 +507,16 @@ user_agent_parsers:
417
507
  - regex: '(Whale)/(\d+)\.(\d+)\.(\d+)'
418
508
  family_replacement: 'Whale'
419
509
 
510
+ # 1Password
511
+ - regex: '(1Password)/(\d+)\.(\d+)\.(\d+)'
512
+
420
513
  # Ghost
421
514
  # @ref: http://www.ghost.org
422
515
  - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
423
516
 
517
+ # Palo Alto GlobalProtect Linux
518
+ - regex: 'PAN (GlobalProtect)/(\d+)\.(\d+)\.(\d+) .{1,100} \(X11; Linux x86_64\)'
519
+
424
520
  #### END SPECIAL CASES TOP ####
425
521
 
426
522
  #### MAIN CASES - this catches > 50% of all browsers ####
@@ -454,7 +550,7 @@ user_agent_parsers:
454
550
  v1_replacement: '2013'
455
551
 
456
552
  # Outlook 2016
457
- - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+'
553
+ - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+|MSOffice 16'
458
554
  family_replacement: 'Outlook'
459
555
  v1_replacement: '2016'
460
556
 
@@ -462,7 +558,7 @@ user_agent_parsers:
462
558
  - regex: 'Microsoft Office (Word) 2014'
463
559
 
464
560
  # Windows Live Mail
465
- - regex: 'Outlook-Express\/7\.0.*'
561
+ - regex: 'Outlook-Express\/7\.0'
466
562
  family_replacement: 'Windows Live Mail'
467
563
 
468
564
  # Apple Air Mail
@@ -484,6 +580,11 @@ user_agent_parsers:
484
580
  - regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+)|)'
485
581
  family_replacement: 'Lotus Notes'
486
582
 
583
+ # Superhuman Mail Client
584
+ # @ref: https://www.superhuman.com
585
+ - regex: 'Superhuman'
586
+ family_replacement: 'Superhuman'
587
+
487
588
  # Vivaldi uses "Vivaldi"
488
589
  - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
489
590
 
@@ -497,7 +598,7 @@ user_agent_parsers:
497
598
  family_replacement: 'Brave'
498
599
 
499
600
  # Iron Browser ~since version 50
500
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
601
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]'
501
602
  family_replacement: 'Iron'
502
603
 
503
604
  # Dolphin Browser
@@ -573,20 +674,20 @@ user_agent_parsers:
573
674
  - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
574
675
  - regex: '^(Stitcher)/iOS'
575
676
  - regex: '^(Stitcher)/Android'
576
- - regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
677
+ - regex: '^(VLC) .{0,200}version (\d+)\.(\d+)\.(\d+)'
577
678
  - regex: ' (VLC) for'
578
679
  - regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
579
680
  family_replacement: 'VLC'
580
- - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
581
- - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
582
- - regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
681
+ - regex: '^(foobar)\S{1,10}/(\d+)\.(\d+|)\.?([\da-z]+|)'
682
+ - regex: '^(Clementine)\S{1,10} (\d+)\.(\d+|)\.?(\d+|)'
683
+ - regex: '(amarok)/(\d+)\.(\d+|)\.?(\d+|)'
583
684
  family_replacement: 'Amarok'
584
685
  - regex: '(Custom)-Feed Reader'
585
686
 
586
687
  # Browser major_version.minor_version.beta_version (space instead of slash)
587
688
  - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
588
689
  # Browser major_version.minor_version (space instead of slash)
589
- - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)\.(\d+)(?:\.(\d+)|)'
690
+ - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
590
691
 
591
692
  # Kindle WebKit
592
693
  - regex: '(Kindle)/(\d+)\.(\d+)'
@@ -613,7 +714,7 @@ user_agent_parsers:
613
714
 
614
715
  # desktop mode
615
716
  # http://www.anandtech.com/show/3982/windows-phone-7-review
616
- - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
717
+ - regex: '(MSIE) (\d+)\.(\d+).{0,100}XBLWP7'
617
718
  family_replacement: 'IE Large Screen'
618
719
 
619
720
  # Nextcloud desktop sync client
@@ -630,6 +731,17 @@ user_agent_parsers:
630
731
  - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
631
732
  family_replacement: 'Skype'
632
733
 
734
+ # OpenVAS Scanner
735
+ - regex: '(OpenVAS)(?:-VT)?(?:[ \/](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
736
+ family_replacement: 'OpenVAS Scanner'
737
+
738
+ # AnyConnect
739
+ - regex: '(AnyConnect)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
740
+
741
+ # Monitis
742
+ - regex: 'compatible; monitis'
743
+ family_replacement: 'Monitis'
744
+
633
745
  #### END MAIN CASES ####
634
746
 
635
747
  #### SPECIAL CASES ####
@@ -657,22 +769,26 @@ user_agent_parsers:
657
769
  - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+|)'
658
770
  family_replacement: 'Bon Echo'
659
771
 
772
+ # topbuzz on IOS
773
+ - regex: '(TopBuzz) com.alex.NewsMaster/(\d+).(\d+).(\d+)'
774
+ family_replacement: 'TopBuzz'
775
+ - regex: '(TopBuzz) com.mobilesrepublic.newsrepublic/(\d+).(\d+).(\d+)'
776
+ family_replacement: 'TopBuzz'
777
+ - regex: '(TopBuzz) com.topbuzz.videoen/(\d+).(\d+).(\d+)'
778
+ family_replacement: 'TopBuzz'
779
+
660
780
  # @note: iOS / OSX Applications
661
- - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+) Mobile'
781
+ - regex: '(iPod|iPhone|iPad).{1,200}GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
662
782
  family_replacement: 'Google'
663
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
783
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|).{1,200}[ +]Safari'
664
784
  family_replacement: 'Mobile Safari'
665
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
785
+ - regex: '(iPod|iPod touch|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +](\d+)_(\d+)(?:_(\d+)|).{0,30} AppleNews\/\d+\.\d+(?:\.\d+|)'
666
786
  family_replacement: 'Mobile Safari UI/WKWebView'
667
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
787
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
668
788
  family_replacement: 'Mobile Safari UI/WKWebView'
669
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile.*[ +]Safari'
789
+ - regex: '(iPod|iPod touch|iPhone|iPad).{0,200} Safari'
670
790
  family_replacement: 'Mobile Safari'
671
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile'
672
- family_replacement: 'Mobile Safari UI/WKWebView'
673
- - regex: '(iPod|iPhone|iPad).* Safari'
674
- family_replacement: 'Mobile Safari'
675
- - regex: '(iPod|iPhone|iPad)'
791
+ - regex: '(iPod|iPod touch|iPhone|iPad)'
676
792
  family_replacement: 'Mobile Safari UI/WKWebView'
677
793
  - regex: '(Watch)(\d+),(\d+)'
678
794
  family_replacement: 'Apple $1 App'
@@ -721,9 +837,9 @@ user_agent_parsers:
721
837
  - regex: '(Nokia)[EN]?(\d+)'
722
838
 
723
839
  # BlackBerry devices
724
- - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
840
+ - regex: '(PlayBook).{1,200}RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
725
841
  family_replacement: 'BlackBerry WebKit'
726
- - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
842
+ - regex: '(Black[bB]erry|BB10).{1,200}Version/(\d+)\.(\d+)\.(\d+)'
727
843
  family_replacement: 'BlackBerry WebKit'
728
844
  - regex: '(Black[bB]erry)\s?(\d+)'
729
845
  family_replacement: 'BlackBerry'
@@ -743,18 +859,15 @@ user_agent_parsers:
743
859
 
744
860
  - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
745
861
 
746
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
747
- # family_replacement: 'iPad'
748
-
749
862
  # Phantomjs, should go before Safari
750
863
  - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
751
864
 
752
865
  # WebKit Nightly
753
- - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
866
+ - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .{0,200} Safari'
754
867
  family_replacement: 'WebKit Nightly'
755
868
 
756
869
  # Safari
757
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
870
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).{0,100}Safari/'
758
871
  family_replacement: 'Safari'
759
872
  # Safari didn't provide "Version/d.d.d" prior to 3.0
760
873
  - regex: '(Safari)/\d+'
@@ -803,6 +916,7 @@ user_agent_parsers:
803
916
  - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
804
917
  - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
805
918
 
919
+
806
920
  - regex: '([MS]?IE) (\d+)\.(\d+)'
807
921
  family_replacement: 'IE'
808
922
 
@@ -810,13 +924,61 @@ user_agent_parsers:
810
924
  family_replacement: 'Python Requests'
811
925
 
812
926
  # headless user-agents
813
- - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
927
+ - regex: '\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got|CloudCockpitBackend|ReactorNetty|axios|Jersey|Vert.x-WebClient|Apache-CXF|Go-CF-client|go-resty|AHC)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
928
+
929
+ # CloudFoundry
930
+ - regex: '^(cf)\/(\d+)\.(\d+)\.(\S+)'
931
+ family_replacement: 'CloudFoundry'
932
+
933
+ # SAP Leonardo
934
+ - regex: '^(sap-leonardo-iot-sdk-nodejs) \/ (\d+)\.(\d+)\.(\d+)'
935
+
936
+ # SAP Netweaver Application Server
937
+ - regex: '^(SAP NetWeaver Application Server) \(1.0;(\d{1})(\d{2})\)'
814
938
 
815
- - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
939
+ # HttpClient
940
+ - regex: '^(\w+-HTTPClient)\/(\d+)\.(\d+)-(\S+)'
941
+ family_replacement: 'HTTPClient'
942
+
943
+ # go-cli
944
+ - regex: '^(go-cli)\s(\d+)\.(\d+).(\S+)'
945
+
946
+ # Other Clients with the pattern <Name>/[v]<Major>.<Minor>[.<Patch>]
947
+ - regex: '^(Java-EurekaClient|Java-EurekaClient-Replication|HTTPClient|lua-resty-http)\/v?(\d+)\.(\d+)\.?(\d*)'
948
+
949
+ ## Clints with the pattern <Name>
950
+ - regex: '^(ping-service|sap xsuaa|Node-oauth|Site24x7|SAP CPI|JAEGER_SECURITY)'
951
+
952
+ # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
953
+ - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
954
+ family_replacement: 'Python aiohttp'
955
+
956
+ - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
957
+
958
+ # minio-go (https://github.com/minio/minio-go)
959
+ - regex: '(minio-go)/v(\d+)\.(\d+)\.(\d+)'
960
+
961
+ # ureq - minimal request library in rust (https://github.com/algesten/ureq)
962
+ - regex: '^(ureq)[/ ](\d+)\.(\d+).(\d+)'
963
+
964
+ # http.rb - HTTP (The Gem! a.k.a. http.rb) - a fast Ruby HTTP client
965
+ # (https://github.com/httprb/http/blob/3aa7470288deb81f7d7b982c1e2381871049dcbb/lib/http/request.rb#L27)
966
+ - regex: '^(http\.rb)/(\d+)\.(\d+).(\d+)'
967
+
968
+ # Guzzle, PHP HTTP client (https://docs.guzzlephp.org/)
969
+ - regex: '^(GuzzleHttp)/(\d+)\.(\d+).(\d+)'
970
+
971
+ # lorien/grab - Web Scraping Framework (https://github.com/lorien/grab)
972
+ - regex: '^(grab)\b'
816
973
 
817
974
  # Cloud Storage Clients
818
975
  - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
819
- - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
976
+ - regex: '^(S3 Browser) (\d+)[.-](\d+)[.-](\d+)(?:\s*https?://s3browser\.com|)'
977
+ - regex: '(S3Gof3r)'
978
+ # IBM COS (Cloud Object Storage) API
979
+ - regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
980
+ # rusoto - Rusoto - AWS SDK for Rust - https://github.com/rusoto/rusoto
981
+ - regex: '^(rusoto)/(\d+)\.(\d+)\.(\d+)'
820
982
  # rclone - rsync for cloud storage - https://rclone.org/
821
983
  - regex: '^(rclone)/v(\d+)\.(\d+)'
822
984
 
@@ -834,6 +996,15 @@ user_agent_parsers:
834
996
  - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
835
997
  family_replacement: 'ViaFree'
836
998
 
999
+ # Transmit (https://library.panic.com/transmit/)
1000
+ - regex: '(Transmit)/(\d+)\.(\d+)\.(\d+)'
1001
+
1002
+ # Download Master (https://downloadmaster.ru/)
1003
+ - regex: '(Download Master)'
1004
+
1005
+ # HTTrack crawler
1006
+ - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)'
1007
+
837
1008
  os_parsers:
838
1009
  ##########
839
1010
  # HbbTV vendors
@@ -849,7 +1020,7 @@ os_parsers:
849
1020
  # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
850
1021
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
851
1022
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
852
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
1023
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.{0,200};.{0,200}; ([0-9]{4});\)'
853
1024
 
854
1025
 
855
1026
  # LG is consistent too, but we need to add manually the year model
@@ -869,9 +1040,9 @@ os_parsers:
869
1040
  os_replacement: 'Samsung'
870
1041
  os_v1_replacement: '2011'
871
1042
  # manage the two models of 2013
872
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
1043
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}FXPDEUC'
873
1044
  os_v2_replacement: 'UE40F7000'
874
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
1045
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}MST12DEUC'
875
1046
  os_v2_replacement: 'UE32F4500'
876
1047
  # generic Samsung (works starting in 2012)
877
1048
  #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
@@ -879,22 +1050,26 @@ os_parsers:
879
1050
  # Philips : not found any other way than a manual mapping
880
1051
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/4.1.3 PHILIPSTV/1.1.1; en) Presto/2.10.250 Version/11.60
881
1052
  # Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70
882
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
1053
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/4'
883
1054
  os_v1_replacement: '2013'
884
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
1055
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/3'
885
1056
  os_v1_replacement: '2012'
886
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
1057
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/2'
887
1058
  os_v1_replacement: '2011'
888
1059
 
889
1060
  # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
890
- - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
1061
+ - regex: 'HbbTV/\d+\.\d+\.\d+.{0,100}(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
891
1062
  os_replacement: 'FireHbbTV'
892
1063
 
893
1064
  # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
894
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
1065
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\)'
1066
+
1067
+ # aspiegel.com spider (owned by Huawei)
1068
+ - regex: 'AspiegelBot'
1069
+ os_replacement: 'Other'
895
1070
 
896
1071
  ##########
897
- # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
1072
+ # @note: Windows Phone needs to come before Windows NT 6.1 {0,2}and* before Android to catch cases such as:
898
1073
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
899
1074
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
900
1075
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
@@ -903,10 +1078,16 @@ os_parsers:
903
1078
 
904
1079
  - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
905
1080
 
906
- # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
907
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
1081
+ # Again a MS-special one: iPhone.{0,200}Outlook-iOS-Android/x.x is erroneously detected as Android
1082
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).{0,100}Outlook-iOS-Android'
908
1083
  os_replacement: 'iOS'
909
1084
 
1085
+ # Special case for old ArcGIS Mobile products
1086
+ - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]{1,50}|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1087
+
1088
+ # Special case for new ArcGIS Mobile products
1089
+ - regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
1090
+
910
1091
  ##########
911
1092
  # Android
912
1093
  # can actually detect rooted android os. do we care?
@@ -932,15 +1113,18 @@ os_parsers:
932
1113
  - regex: '(Android) Honeycomb'
933
1114
  os_v1_replacement: '3'
934
1115
 
1116
+ # Android 9; Android 10;
1117
+ - regex: '(Android) (\d+);'
1118
+
935
1119
  # UCWEB
936
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
1120
+ - regex: '^UCWEB.{0,200}; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]{1,100})|);'
937
1121
  os_replacement: 'Android'
938
- - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1122
+ - regex: '^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
939
1123
  os_replacement: 'iOS'
940
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1124
+ - regex: '^UCWEB.{0,200}; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
941
1125
  os_replacement: 'Windows Phone'
942
1126
  # JUC
943
- - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
1127
+ - regex: '^(JUC).{0,200}; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]{1,100})|)'
944
1128
  os_replacement: 'Android'
945
1129
 
946
1130
  # Salesforce
@@ -958,7 +1142,7 @@ os_parsers:
958
1142
  # properly identify as Chrome OS
959
1143
  #
960
1144
  # ex: Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp
961
- - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
1145
+ - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$'
962
1146
  os_replacement: 'Chrome OS'
963
1147
 
964
1148
  ##########
@@ -987,11 +1171,11 @@ os_parsers:
987
1171
  os_replacement: 'Windows'
988
1172
  os_v1_replacement: 'XP'
989
1173
 
990
- - regex: '(Windows NT 6\.1)'
1174
+ - regex: '(Win(?:dows NT |32NT\/)6\.1)'
991
1175
  os_replacement: 'Windows'
992
1176
  os_v1_replacement: '7'
993
1177
 
994
- - regex: '(Windows NT 6\.0)'
1178
+ - regex: '(Win(?:dows NT |32NT\/)6\.0)'
995
1179
  os_replacement: 'Windows'
996
1180
  os_v1_replacement: 'Vista'
997
1181
 
@@ -1003,7 +1187,7 @@ os_parsers:
1003
1187
  os_replacement: 'Windows'
1004
1188
  os_v1_replacement: 'RT'
1005
1189
 
1006
- - regex: '(Windows NT 6\.2)'
1190
+ - regex: '(Win(?:dows NT |32NT\/)6\.2)'
1007
1191
  os_replacement: 'Windows'
1008
1192
  os_v1_replacement: '8'
1009
1193
 
@@ -1012,12 +1196,12 @@ os_parsers:
1012
1196
  os_v1_replacement: 'RT 8'
1013
1197
  os_v2_replacement: '1'
1014
1198
 
1015
- - regex: '(Windows NT 6\.3)'
1199
+ - regex: '(Win(?:dows NT |32NT\/)6\.3)'
1016
1200
  os_replacement: 'Windows'
1017
1201
  os_v1_replacement: '8'
1018
1202
  os_v2_replacement: '1'
1019
1203
 
1020
- - regex: '(Windows NT 6\.4)'
1204
+ - regex: '(Win(?:dows NT |32NT\/)6\.4)'
1021
1205
  os_replacement: 'Windows'
1022
1206
  os_v1_replacement: '10'
1023
1207
 
@@ -1050,7 +1234,7 @@ os_parsers:
1050
1234
  os_v1_replacement: '95'
1051
1235
 
1052
1236
  # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads
1053
- - regex: '^Box.*Windows/([\d.]+);'
1237
+ - regex: '^Box.{0,200}Windows/([\d.]+);'
1054
1238
  os_replacement: 'Windows'
1055
1239
  os_v1_replacement: '$1'
1056
1240
 
@@ -1067,33 +1251,33 @@ os_parsers:
1067
1251
  ##########
1068
1252
  - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
1069
1253
  os_replacement: 'Mac OS X'
1070
- - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
1254
+ - regex: 'Mac OS X\s.{1,50}\s(\d+).(\d+).(\d+)'
1071
1255
  os_replacement: 'Mac OS X'
1072
1256
  os_v1_replacement: '$1'
1073
1257
  os_v2_replacement: '$2'
1074
1258
  os_v3_replacement: '$3'
1075
1259
  # Leopard
1076
- - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
1260
+ - regex: ' (Dar)(win)/(9).(\d+).{0,100}\((?:i386|x86_64|Power Macintosh)\)'
1077
1261
  os_replacement: 'Mac OS X'
1078
1262
  os_v1_replacement: '10'
1079
1263
  os_v2_replacement: '5'
1080
1264
  # Snow Leopard
1081
- - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
1265
+ - regex: ' (Dar)(win)/(10).(\d+).{0,100}\((?:i386|x86_64)\)'
1082
1266
  os_replacement: 'Mac OS X'
1083
1267
  os_v1_replacement: '10'
1084
1268
  os_v2_replacement: '6'
1085
1269
  # Lion
1086
- - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
1270
+ - regex: ' (Dar)(win)/(11).(\d+).{0,100}\((?:i386|x86_64)\)'
1087
1271
  os_replacement: 'Mac OS X'
1088
1272
  os_v1_replacement: '10'
1089
1273
  os_v2_replacement: '7'
1090
1274
  # Mountain Lion
1091
- - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
1275
+ - regex: ' (Dar)(win)/(12).(\d+).{0,100}\((?:i386|x86_64)\)'
1092
1276
  os_replacement: 'Mac OS X'
1093
1277
  os_v1_replacement: '10'
1094
1278
  os_v2_replacement: '8'
1095
1279
  # Mavericks
1096
- - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
1280
+ - regex: ' (Dar)(win)/(13).(\d+).{0,100}\((?:i386|x86_64)\)'
1097
1281
  os_replacement: 'Mac OS X'
1098
1282
  os_v1_replacement: '10'
1099
1283
  os_v2_replacement: '9'
@@ -1110,7 +1294,7 @@ os_parsers:
1110
1294
  - regex: '(?:PPC|Intel) (Mac OS X)'
1111
1295
 
1112
1296
  # Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
1113
- - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1297
+ - regex: '^Box.{0,200};(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1114
1298
  os_replacement: 'Mac OS X'
1115
1299
 
1116
1300
  ##########
@@ -1121,7 +1305,7 @@ os_parsers:
1121
1305
  - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
1122
1306
  os_replacement: 'ATV OS X'
1123
1307
 
1124
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1308
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1125
1309
  os_replacement: 'iOS'
1126
1310
 
1127
1311
  # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
@@ -1129,15 +1313,15 @@ os_parsers:
1129
1313
  os_replacement: 'iOS'
1130
1314
 
1131
1315
  # few more stragglers
1132
- - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
1316
+ - regex: '(iPhone|iPad|iPod).{0,100}Mac OS X.{0,100}Version/(\d+)\.(\d+)'
1133
1317
  os_replacement: 'iOS'
1134
1318
 
1135
1319
  # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
1136
1320
  # whether the os maps to Mac OS, or iOS, or just Darwin.
1137
1321
  # See: http://user-agents.me/cfnetwork-version-list
1138
- - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
1322
+ - regex: '(CFNetwork)/(5)48\.0\.3.{0,100} Darwin/11\.0\.0'
1139
1323
  os_replacement: 'iOS'
1140
- - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
1324
+ - regex: '(CFNetwork)/(5)48\.(0)\.4.{0,100} Darwin/(1)1\.0\.0'
1141
1325
  os_replacement: 'iOS'
1142
1326
  - regex: '(CFNetwork)/(5)48\.(1)\.4'
1143
1327
  os_replacement: 'iOS'
@@ -1172,17 +1356,17 @@ os_parsers:
1172
1356
  os_replacement: 'Mac OS X'
1173
1357
  os_v1_replacement: '10'
1174
1358
  os_v2_replacement: '11'
1175
- - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+'
1359
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.4\.\d+'
1176
1360
  os_replacement: 'iOS'
1177
1361
  os_v1_replacement: '9'
1178
1362
  os_v2_replacement: '3'
1179
1363
  os_v3_replacement: '1'
1180
- - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+'
1364
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.5\.\d+'
1181
1365
  os_replacement: 'iOS'
1182
1366
  os_v1_replacement: '9'
1183
1367
  os_v2_replacement: '3'
1184
1368
  os_v3_replacement: '2'
1185
- - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+'
1369
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.6\.\d+'
1186
1370
  os_replacement: 'iOS'
1187
1371
  os_v1_replacement: '9'
1188
1372
  os_v2_replacement: '3'
@@ -1203,15 +1387,15 @@ os_parsers:
1203
1387
  # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
1204
1388
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1205
1389
  ##########
1206
- - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)'
1390
+ - regex: 'CFNetwork/.{0,100} Darwin/17\.\d+.{0,100}\(x86_64\)'
1207
1391
  os_replacement: 'Mac OS X'
1208
1392
  os_v1_replacement: '10'
1209
1393
  os_v2_replacement: '13'
1210
- - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
1394
+ - regex: 'CFNetwork/.{0,100} Darwin/16\.\d+.{0,100}\(x86_64\)'
1211
1395
  os_replacement: 'Mac OS X'
1212
1396
  os_v1_replacement: '10'
1213
1397
  os_v2_replacement: '12'
1214
- - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
1398
+ - regex: 'CFNetwork/8.{0,100} Darwin/15\.\d+.{0,100}\(x86_64\)'
1215
1399
  os_replacement: 'Mac OS X'
1216
1400
  os_v1_replacement: '10'
1217
1401
  os_v2_replacement: '11'
@@ -1219,87 +1403,146 @@ os_parsers:
1219
1403
  # CFNetwork iOS Apps
1220
1404
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1221
1405
  ##########
1222
- - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
1406
+ - regex: 'CFNetwork/.{0,100} Darwin/(9)\.\d+'
1223
1407
  os_replacement: 'iOS'
1224
1408
  os_v1_replacement: '1'
1225
- - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
1409
+ - regex: 'CFNetwork/.{0,100} Darwin/(10)\.\d+'
1226
1410
  os_replacement: 'iOS'
1227
1411
  os_v1_replacement: '4'
1228
- - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
1412
+ - regex: 'CFNetwork/.{0,100} Darwin/(11)\.\d+'
1229
1413
  os_replacement: 'iOS'
1230
1414
  os_v1_replacement: '5'
1231
- - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
1415
+ - regex: 'CFNetwork/.{0,100} Darwin/(13)\.\d+'
1232
1416
  os_replacement: 'iOS'
1233
1417
  os_v1_replacement: '6'
1234
- - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
1418
+ - regex: 'CFNetwork/6.{0,100} Darwin/(14)\.\d+'
1235
1419
  os_replacement: 'iOS'
1236
1420
  os_v1_replacement: '7'
1237
- - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
1421
+ - regex: 'CFNetwork/7.{0,100} Darwin/(14)\.\d+'
1238
1422
  os_replacement: 'iOS'
1239
1423
  os_v1_replacement: '8'
1240
1424
  os_v2_replacement: '0'
1241
- - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
1425
+ - regex: 'CFNetwork/7.{0,100} Darwin/(15)\.\d+'
1242
1426
  os_replacement: 'iOS'
1243
1427
  os_v1_replacement: '9'
1244
1428
  os_v2_replacement: '0'
1245
- - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+'
1429
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.5\.\d+'
1246
1430
  os_replacement: 'iOS'
1247
1431
  os_v1_replacement: '10'
1248
1432
  os_v2_replacement: '3'
1249
- - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+'
1433
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.6\.\d+'
1250
1434
  os_replacement: 'iOS'
1251
1435
  os_v1_replacement: '10'
1252
1436
  os_v2_replacement: '3'
1253
1437
  os_v3_replacement: '2'
1254
- - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+'
1438
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.7\.\d+'
1255
1439
  os_replacement: 'iOS'
1256
1440
  os_v1_replacement: '10'
1257
1441
  os_v2_replacement: '3'
1258
1442
  os_v3_replacement: '3'
1259
- - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
1443
+ - regex: 'CFNetwork/8.{0,100} Darwin/(16)\.\d+'
1260
1444
  os_replacement: 'iOS'
1261
1445
  os_v1_replacement: '10'
1262
- - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+'
1446
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.0\.\d+'
1263
1447
  os_replacement: 'iOS'
1264
1448
  os_v1_replacement: '11'
1265
1449
  os_v2_replacement: '0'
1266
- - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+'
1450
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.2\.\d+'
1267
1451
  os_replacement: 'iOS'
1268
1452
  os_v1_replacement: '11'
1269
1453
  os_v2_replacement: '1'
1270
- - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+'
1454
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.3\.\d+'
1271
1455
  os_replacement: 'iOS'
1272
1456
  os_v1_replacement: '11'
1273
1457
  os_v2_replacement: '2'
1274
- - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+'
1458
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.4\.\d+'
1275
1459
  os_replacement: 'iOS'
1276
1460
  os_v1_replacement: '11'
1277
1461
  os_v2_replacement: '2'
1278
1462
  os_v3_replacement: '6'
1279
- - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+'
1463
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.5\.\d+'
1280
1464
  os_replacement: 'iOS'
1281
1465
  os_v1_replacement: '11'
1282
1466
  os_v2_replacement: '3'
1283
- - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+'
1467
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.6\.\d+'
1284
1468
  os_replacement: 'iOS'
1285
1469
  os_v1_replacement: '11'
1286
1470
  os_v2_replacement: '4'
1287
- - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+'
1471
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.7\.\d+'
1288
1472
  os_replacement: 'iOS'
1289
1473
  os_v1_replacement: '11'
1290
1474
  os_v2_replacement: '4'
1291
1475
  os_v3_replacement: '1'
1292
- - regex: 'CFNetwork/8.* Darwin/(17)\.\d+'
1476
+ - regex: 'CFNetwork/8.{0,100} Darwin/(17)\.\d+'
1293
1477
  os_replacement: 'iOS'
1294
1478
  os_v1_replacement: '11'
1295
- - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+'
1479
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.0\.\d+'
1296
1480
  os_replacement: 'iOS'
1297
1481
  os_v1_replacement: '12'
1298
1482
  os_v2_replacement: '0'
1299
- - regex: 'CFNetwork/9.* Darwin/(18)\.\d+'
1483
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.2\.\d+'
1300
1484
  os_replacement: 'iOS'
1301
1485
  os_v1_replacement: '12'
1302
- - regex: 'CFNetwork/.* Darwin/'
1486
+ os_v2_replacement: '1'
1487
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.5\.\d+'
1488
+ os_replacement: 'iOS'
1489
+ os_v1_replacement: '12'
1490
+ os_v2_replacement: '2'
1491
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.6\.\d+'
1492
+ os_replacement: 'iOS'
1493
+ os_v1_replacement: '12'
1494
+ os_v2_replacement: '3'
1495
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.7\.\d+'
1496
+ os_replacement: 'iOS'
1497
+ os_v1_replacement: '12'
1498
+ os_v2_replacement: '4'
1499
+ - regex: 'CFNetwork/9.{0,100} Darwin/(18)\.\d+'
1500
+ os_replacement: 'iOS'
1501
+ os_v1_replacement: '12'
1502
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.2\.\d+'
1503
+ os_replacement: 'iOS'
1504
+ os_v1_replacement: '13'
1505
+ os_v2_replacement: '3'
1506
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.3\.\d+'
1507
+ os_replacement: 'iOS'
1508
+ os_v1_replacement: '13'
1509
+ os_v2_replacement: '3'
1510
+ os_v3_replacement: '1'
1511
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.4\.\d+'
1512
+ os_replacement: 'iOS'
1513
+ os_v1_replacement: '13'
1514
+ os_v2_replacement: '4'
1515
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.5\.\d+'
1516
+ os_replacement: 'iOS'
1517
+ os_v1_replacement: '13'
1518
+ os_v2_replacement: '5'
1519
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.6\.\d+'
1520
+ os_replacement: 'iOS'
1521
+ os_v1_replacement: '13'
1522
+ os_v2_replacement: '6'
1523
+ - regex: 'CFNetwork/1[01].{0,100} Darwin/19\.\d+'
1524
+ os_replacement: 'iOS'
1525
+ os_v1_replacement: '13'
1526
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.1\.\d+'
1527
+ os_replacement: 'iOS'
1528
+ os_v1_replacement: '14'
1529
+ os_v2_replacement: '2'
1530
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.2\.\d+'
1531
+ os_replacement: 'iOS'
1532
+ os_v1_replacement: '14'
1533
+ os_v2_replacement: '3'
1534
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.3\.\d+'
1535
+ os_replacement: 'iOS'
1536
+ os_v1_replacement: '14'
1537
+ os_v2_replacement: '4'
1538
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.4\.\d+'
1539
+ os_replacement: 'iOS'
1540
+ os_v1_replacement: '14'
1541
+ os_v2_replacement: '5'
1542
+ - regex: 'CFNetwork/.{0,100} Darwin/(20)\.\d+'
1543
+ os_replacement: 'iOS'
1544
+ os_v1_replacement: '14'
1545
+ - regex: 'CFNetwork/.{0,100} Darwin/'
1303
1546
  os_replacement: 'iOS'
1304
1547
 
1305
1548
  # iOS Apps
@@ -1353,9 +1596,9 @@ os_parsers:
1353
1596
  ##########
1354
1597
  - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
1355
1598
  os_replacement: 'Symbian OS'
1356
- - regex: '(Symbian/3).+NokiaBrowser/7\.3'
1599
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.3'
1357
1600
  os_replacement: 'Symbian^3 Anna'
1358
- - regex: '(Symbian/3).+NokiaBrowser/7\.4'
1601
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.4'
1359
1602
  os_replacement: 'Symbian^3 Belle'
1360
1603
  - regex: '(Symbian/3)'
1361
1604
  os_replacement: 'Symbian^3'
@@ -1372,11 +1615,11 @@ os_parsers:
1372
1615
  ##########
1373
1616
  # BlackBerry devices
1374
1617
  ##########
1375
- - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
1618
+ - regex: '(BB10);.{1,200}Version/(\d+)\.(\d+)\.(\d+)'
1376
1619
  os_replacement: 'BlackBerry OS'
1377
1620
  - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1378
1621
  os_replacement: 'BlackBerry OS'
1379
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1622
+ - regex: '(Black[Bb]erry).{1,200}Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1380
1623
  os_replacement: 'BlackBerry OS'
1381
1624
  - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
1382
1625
  os_replacement: 'BlackBerry Tablet OS'
@@ -1385,47 +1628,53 @@ os_parsers:
1385
1628
  - regex: '(Black[Bb]erry)'
1386
1629
  os_replacement: 'BlackBerry OS'
1387
1630
 
1631
+ ##########
1632
+ # KaiOS
1633
+ ##########
1634
+ - regex: '(K[Aa][Ii]OS)\/(\d+)\.(\d+)(?:\.(\d+)|)'
1635
+ os_replacement: 'KaiOS'
1636
+
1388
1637
  ##########
1389
1638
  # Firefox OS
1390
1639
  ##########
1391
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
1640
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.0 Firefox/\d+\.\d+'
1392
1641
  os_replacement: 'Firefox OS'
1393
1642
  os_v1_replacement: '1'
1394
1643
  os_v2_replacement: '0'
1395
1644
  os_v3_replacement: '1'
1396
1645
 
1397
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
1646
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.1 Firefox/\d+\.\d+'
1398
1647
  os_replacement: 'Firefox OS'
1399
1648
  os_v1_replacement: '1'
1400
1649
  os_v2_replacement: '1'
1401
1650
 
1402
- - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
1651
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/26.0 Firefox/\d+\.\d+'
1403
1652
  os_replacement: 'Firefox OS'
1404
1653
  os_v1_replacement: '1'
1405
1654
  os_v2_replacement: '2'
1406
1655
 
1407
- - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
1656
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/28.0 Firefox/\d+\.\d+'
1408
1657
  os_replacement: 'Firefox OS'
1409
1658
  os_v1_replacement: '1'
1410
1659
  os_v2_replacement: '3'
1411
1660
 
1412
- - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
1661
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/30.0 Firefox/\d+\.\d+'
1413
1662
  os_replacement: 'Firefox OS'
1414
1663
  os_v1_replacement: '1'
1415
1664
  os_v2_replacement: '4'
1416
1665
 
1417
- - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
1666
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/32.0 Firefox/\d+\.\d+'
1418
1667
  os_replacement: 'Firefox OS'
1419
1668
  os_v1_replacement: '2'
1420
1669
  os_v2_replacement: '0'
1421
1670
 
1422
- - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
1671
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\d+\.\d+'
1423
1672
  os_replacement: 'Firefox OS'
1424
1673
  os_v1_replacement: '2'
1425
1674
  os_v2_replacement: '1'
1426
1675
 
1427
1676
  # Firefox OS Generic
1428
- - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
1677
+ - regex: '\((?:Mobile|Tablet);.{1,200}Firefox/\d+\.\d+'
1429
1678
  os_replacement: 'Firefox OS'
1430
1679
 
1431
1680
 
@@ -1467,7 +1716,7 @@ os_parsers:
1467
1716
  - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
1468
1717
 
1469
1718
  # Gentoo Linux + Kernel Version
1470
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
1719
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).{0,100}gentoo'
1471
1720
  os_replacement: 'Gentoo'
1472
1721
 
1473
1722
  # Opera Mini Bada
@@ -1487,6 +1736,8 @@ os_parsers:
1487
1736
  os_replacement: 'Red Hat'
1488
1737
  - regex: '\((freebsd)(\d+)\.(\d+)\)'
1489
1738
  os_replacement: 'FreeBSD'
1739
+ - regex: 'linux'
1740
+ os_replacement: 'Linux'
1490
1741
 
1491
1742
  # Roku Digital-Video-Players https://www.roku.com/
1492
1743
  - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
@@ -1497,19 +1748,19 @@ device_parsers:
1497
1748
  # Mobile Spiders
1498
1749
  # Catch the mobile crawler before checking for iPhones / Androids.
1499
1750
  #########
1500
- - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
1751
+ - regex: '^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.{0,200}iPhone)'
1501
1752
  regex_flag: 'i'
1502
1753
  device_replacement: 'Spider'
1503
1754
  brand_replacement: 'Spider'
1504
1755
  model_replacement: 'Smartphone'
1505
- - regex: '(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
1756
+ - regex: '^.{0,100}?(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).{0,200}(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
1506
1757
  regex_flag: 'i'
1507
1758
  device_replacement: 'Spider'
1508
1759
  brand_replacement: 'Spider'
1509
1760
  model_replacement: 'Feature Phone'
1510
1761
 
1511
1762
  # PTST / WebPageTest.org crawlers
1512
- - regex: ' PTST/\d+(?:\.)?\d+$'
1763
+ - regex: ' PTST/\d+(?:\.\d+|)$'
1513
1764
  device_replacement: 'Spider'
1514
1765
  brand_replacement: 'Spider'
1515
1766
 
@@ -1518,11 +1769,21 @@ device_parsers:
1518
1769
  device_replacement: 'Spider'
1519
1770
  brand_replacement: 'Spider'
1520
1771
 
1772
+ # aspiegel.com spider (owned by Huawei)
1773
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
1774
+ device_replacement: 'Spider'
1775
+ brand_replacement: 'Spider'
1776
+ model_replacement: 'Smartphone'
1777
+ - regex: 'Mozilla.{0,200}AspiegelBot'
1778
+ device_replacement: 'Spider'
1779
+ brand_replacement: 'Spider'
1780
+ model_replacement: 'Desktop'
1781
+
1521
1782
  #########
1522
1783
  # WebBrowser for SmartWatch
1523
1784
  # @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
1524
1785
  #########
1525
- - regex: '\bSmartWatch *\( *([^;]+) *; *([^;]+) *;'
1786
+ - regex: '\bSmartWatch {0,2}\( {0,2}([^;]{1,200}) {0,2}; {0,2}([^;]{1,200}) {0,2};'
1526
1787
  device_replacement: '$1 $2'
1527
1788
  brand_replacement: '$1'
1528
1789
  model_replacement: '$2'
@@ -1534,16 +1795,16 @@ device_parsers:
1534
1795
  ######################################################################
1535
1796
 
1536
1797
  # Android Application
1537
- - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
1798
+ - regex: 'Android Application[^\-]{1,300} - (Sony) ?(Ericsson|) (.{1,200}) \w{1,20} - '
1538
1799
  device_replacement: '$1 $2'
1539
1800
  brand_replacement: '$1$2'
1540
1801
  model_replacement: '$3'
1541
- - regex: 'Android Application[^\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.+) \w+ - '
1802
+ - regex: 'Android Application[^\-]{1,300} - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.{1,200}) \w{1,20} - '
1542
1803
  regex_flag: 'i'
1543
1804
  device_replacement: '$1 $2'
1544
1805
  brand_replacement: '$1'
1545
1806
  model_replacement: '$2'
1546
- - regex: 'Android Application[^\-]+ - ([^ ]+) (.+) \w+ - '
1807
+ - regex: 'Android Application[^\-]{1,300} - ([^ ]+) (.{1,200}) \w{1,20} - '
1547
1808
  device_replacement: '$1 $2'
1548
1809
  brand_replacement: '$1'
1549
1810
  model_replacement: '$2'
@@ -1552,11 +1813,11 @@ device_parsers:
1552
1813
  # 3Q
1553
1814
  # @ref: http://www.3q-int.com/
1554
1815
  #########
1555
- - regex: '; *([BLRQ]C\d{4}[A-Z]+) +Build/'
1816
+ - regex: '; {0,2}([BLRQ]C\d{4}[A-Z]{1,100}?)(?: Build|\) AppleWebKit)'
1556
1817
  device_replacement: '3Q $1'
1557
1818
  brand_replacement: '3Q'
1558
1819
  model_replacement: '$1'
1559
- - regex: '; *(?:3Q_)([^;/]+) +Build'
1820
+ - regex: '; {0,2}(?:3Q_)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1560
1821
  device_replacement: '3Q $1'
1561
1822
  brand_replacement: '3Q'
1562
1823
  model_replacement: '$1'
@@ -1565,19 +1826,19 @@ device_parsers:
1565
1826
  # Acer
1566
1827
  # @ref: http://us.acer.com/ac/en/US/content/group/tablets
1567
1828
  #########
1568
- - 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'
1829
+ - regex: 'Android [34].{0,200}; {0,2}(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1569
1830
  device_replacement: '$1'
1570
1831
  brand_replacement: 'Acer'
1571
1832
  model_replacement: '$1'
1572
- - regex: '; *Acer Iconia Tab ([^;/]+) Build'
1833
+ - regex: '; {0,2}Acer Iconia Tab ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1573
1834
  device_replacement: '$1'
1574
1835
  brand_replacement: 'Acer'
1575
1836
  model_replacement: '$1'
1576
- - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+) Build'
1837
+ - regex: '; {0,2}(Z1[1235]0|E320[^/]{0,10}|S500|S510|Liquid[^;/]{0,30}|Iconia A\d+)(?: Build|\) AppleWebKit)'
1577
1838
  device_replacement: '$1'
1578
1839
  brand_replacement: 'Acer'
1579
1840
  model_replacement: '$1'
1580
- - regex: '; *(Acer |ACER )([^;/]+) Build'
1841
+ - regex: '; {0,2}(Acer |ACER )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1581
1842
  device_replacement: '$1$2'
1582
1843
  brand_replacement: 'Acer'
1583
1844
  model_replacement: '$2'
@@ -1588,7 +1849,7 @@ device_parsers:
1588
1849
  # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
1589
1850
  # custom ROM builds for Vega
1590
1851
  #########
1591
- - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).* Build'
1852
+ - regex: '; {0,2}(Advent |)(Vega(?:Bean|Comb|)).{0,200}?(?: Build|\) AppleWebKit)'
1592
1853
  device_replacement: '$1$2'
1593
1854
  brand_replacement: 'Advent'
1594
1855
  model_replacement: '$2'
@@ -1597,7 +1858,7 @@ device_parsers:
1597
1858
  # Ainol
1598
1859
  # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
1599
1860
  #########
1600
- - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+) Build'
1861
+ - regex: '; {0,2}(Ainol |)((?:NOVO|[Nn]ovo)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1601
1862
  device_replacement: '$1$2'
1602
1863
  brand_replacement: 'Ainol'
1603
1864
  model_replacement: '$2'
@@ -1606,12 +1867,12 @@ device_parsers:
1606
1867
  # Airis
1607
1868
  # @ref: http://airis.es/Tienda/Default.aspx?idG=001
1608
1869
  #########
1609
- - regex: '; *AIRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
1870
+ - regex: '; {0,2}AIRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
1610
1871
  regex_flag: 'i'
1611
1872
  device_replacement: '$1'
1612
1873
  brand_replacement: 'Airis'
1613
1874
  model_replacement: '$1'
1614
- - regex: '; *(OnePAD[^;/]+) Build'
1875
+ - regex: '; {0,2}(OnePAD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1615
1876
  regex_flag: 'i'
1616
1877
  device_replacement: '$1'
1617
1878
  brand_replacement: 'Airis'
@@ -1621,7 +1882,7 @@ device_parsers:
1621
1882
  # Airpad
1622
1883
  # @ref: ??
1623
1884
  #########
1624
- - regex: '; *Airpad[ \-]([^;/]+) Build'
1885
+ - regex: '; {0,2}Airpad[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1625
1886
  device_replacement: 'Airpad $1'
1626
1887
  brand_replacement: 'Airpad'
1627
1888
  model_replacement: '$1'
@@ -1630,29 +1891,29 @@ device_parsers:
1630
1891
  # Alcatel - TCT
1631
1892
  # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
1632
1893
  #########
1633
- - regex: '; *(one ?touch) (EVO7|T10|T20) Build'
1894
+ - regex: '; {0,2}(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1634
1895
  device_replacement: 'Alcatel One Touch $2'
1635
1896
  brand_replacement: 'Alcatel'
1636
1897
  model_replacement: 'One Touch $2'
1637
- - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);? Build'
1898
+ - regex: '; {0,2}(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1638
1899
  regex_flag: 'i'
1639
1900
  device_replacement: 'Alcatel One Touch $1'
1640
1901
  brand_replacement: 'Alcatel'
1641
1902
  model_replacement: 'One Touch $1'
1642
- - regex: '; *(TCL)[ _]([^;/]+) Build'
1903
+ - regex: '; {0,2}(TCL)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1643
1904
  device_replacement: '$1 $2'
1644
1905
  brand_replacement: '$1'
1645
1906
  model_replacement: '$2'
1646
1907
  # operator specific models
1647
- - regex: '; *(Vodafone Smart II|Optimus_Madrid) Build'
1908
+ - regex: '; {0,2}(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1648
1909
  device_replacement: 'Alcatel $1'
1649
1910
  brand_replacement: 'Alcatel'
1650
1911
  model_replacement: '$1'
1651
- - regex: '; *BASE_Lutea_3 Build'
1912
+ - regex: '; {0,2}BASE_Lutea_3(?: Build|\) AppleWebKit)'
1652
1913
  device_replacement: 'Alcatel One Touch 998'
1653
1914
  brand_replacement: 'Alcatel'
1654
1915
  model_replacement: 'One Touch 998'
1655
- - regex: '; *BASE_Varia Build'
1916
+ - regex: '; {0,2}BASE_Varia(?: Build|\) AppleWebKit)'
1656
1917
  device_replacement: 'Alcatel One Touch 918D'
1657
1918
  brand_replacement: 'Alcatel'
1658
1919
  model_replacement: 'One Touch 918D'
@@ -1661,7 +1922,7 @@ device_parsers:
1661
1922
  # Allfine
1662
1923
  # @ref: http://www.myallfine.com/Products.asp
1663
1924
  #########
1664
- - regex: '; *((?:FINE|Fine)\d[^;/]+) Build'
1925
+ - regex: '; {0,2}((?:FINE|Fine)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1665
1926
  device_replacement: '$1'
1666
1927
  brand_replacement: 'Allfine'
1667
1928
  model_replacement: '$1'
@@ -1670,15 +1931,15 @@ device_parsers:
1670
1931
  # Allview
1671
1932
  # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
1672
1933
  #########
1673
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*) Build/'
1934
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).{0,200}?)(?: Build|\) AppleWebKit)'
1674
1935
  device_replacement: '$1$2'
1675
1936
  brand_replacement: 'Allview'
1676
1937
  model_replacement: '$2'
1677
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy) Build'
1938
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1678
1939
  device_replacement: '$1$2'
1679
1940
  brand_replacement: 'Allview'
1680
1941
  model_replacement: '$2'
1681
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*) Build'
1942
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1682
1943
  device_replacement: '$1$2'
1683
1944
  brand_replacement: 'Allview'
1684
1945
  model_replacement: '$2'
@@ -1688,11 +1949,11 @@ device_parsers:
1688
1949
  # @ref: http://www.allwinner.com/
1689
1950
  # @models: A31 (13.3"),A20,A10,
1690
1951
  #########
1691
- - regex: '; *(A13-MID) Build'
1952
+ - regex: '; {0,2}(A13-MID)(?: Build|\) AppleWebKit)'
1692
1953
  device_replacement: '$1'
1693
1954
  brand_replacement: 'Allwinner'
1694
1955
  model_replacement: '$1'
1695
- - regex: '; *(Allwinner)[ _\-]?([^;/]+) Build'
1956
+ - regex: '; {0,2}(Allwinner)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1696
1957
  device_replacement: '$1 $2'
1697
1958
  brand_replacement: 'Allwinner'
1698
1959
  model_replacement: '$1'
@@ -1701,7 +1962,7 @@ device_parsers:
1701
1962
  # Amaway
1702
1963
  # @ref: http://www.amaway.cn/
1703
1964
  #########
1704
- - 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'
1965
+ - regex: '; {0,2}(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\) AppleWebKit)'
1705
1966
  device_replacement: '$1'
1706
1967
  brand_replacement: 'Amaway'
1707
1968
  model_replacement: '$1'
@@ -1710,11 +1971,11 @@ device_parsers:
1710
1971
  # Amoi
1711
1972
  # @ref: http://www.amoi.com/en/prd/prd_index.jspx
1712
1973
  #########
1713
- - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+) Build'
1974
+ - regex: '; {0,2}(?:AMOI|Amoi)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1714
1975
  device_replacement: 'Amoi $1'
1715
1976
  brand_replacement: 'Amoi'
1716
1977
  model_replacement: '$1'
1717
- - regex: '^(?:AMOI|Amoi)[ _]([^;/]+) Linux'
1978
+ - regex: '^(?:AMOI|Amoi)[ _]([^;/]{1,100}?) Linux'
1718
1979
  device_replacement: 'Amoi $1'
1719
1980
  brand_replacement: 'Amoi'
1720
1981
  model_replacement: '$1'
@@ -1723,7 +1984,7 @@ device_parsers:
1723
1984
  # Aoc
1724
1985
  # @ref: http://latin.aoc.com/media_tablet
1725
1986
  #########
1726
- - regex: '; *(MW(?:0[789]|10)[^;/]+) Build'
1987
+ - regex: '; {0,2}(MW(?:0[789]|10)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1727
1988
  device_replacement: '$1'
1728
1989
  brand_replacement: 'Aoc'
1729
1990
  model_replacement: '$1'
@@ -1734,11 +1995,11 @@ device_parsers:
1734
1995
  # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
1735
1996
  # @note: brand owned by luckystar
1736
1997
  #########
1737
- - 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'
1998
+ - regex: '; {0,2}(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\) AppleWebKit)'
1738
1999
  device_replacement: 'Aoson $1'
1739
2000
  brand_replacement: 'Aoson'
1740
2001
  model_replacement: '$1'
1741
- - regex: '; *Aoson ([^;/]+) Build'
2002
+ - regex: '; {0,2}Aoson ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1742
2003
  regex_flag: 'i'
1743
2004
  device_replacement: 'Aoson $1'
1744
2005
  brand_replacement: 'Aoson'
@@ -1748,7 +2009,7 @@ device_parsers:
1748
2009
  # Apanda
1749
2010
  # @ref: http://www.apanda.com.cn/
1750
2011
  #########
1751
- - regex: '; *[Aa]panda[ _\-]([^;/]+) Build'
2012
+ - regex: '; {0,2}[Aa]panda[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1752
2013
  device_replacement: 'Apanda $1'
1753
2014
  brand_replacement: 'Apanda'
1754
2015
  model_replacement: '$1'
@@ -1758,23 +2019,23 @@ device_parsers:
1758
2019
  # @ref: http://www.archos.com/de/products/tablets.html
1759
2020
  # @ref: http://www.archos.com/de/products/smartphones/index.html
1760
2021
  #########
1761
- - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|[;/\(\)\-])'
2022
+ - regex: '; {0,2}(?:ARCHOS|Archos) ?(GAMEPAD.{0,200}?)(?: Build|\) AppleWebKit)'
1762
2023
  device_replacement: 'Archos $1'
1763
2024
  brand_replacement: 'Archos'
1764
2025
  model_replacement: '$1'
1765
- - regex: 'ARCHOS; GOGI; ([^;]+);'
2026
+ - regex: 'ARCHOS; GOGI; ([^;]{1,200});'
1766
2027
  device_replacement: 'Archos $1'
1767
2028
  brand_replacement: 'Archos'
1768
2029
  model_replacement: '$1'
1769
- - regex: '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\(\)\-]|$)'
2030
+ - regex: '(?:ARCHOS|Archos)[ _]?(.{0,200}?)(?: Build|[;/\(\)\-]|$)'
1770
2031
  device_replacement: 'Archos $1'
1771
2032
  brand_replacement: 'Archos'
1772
2033
  model_replacement: '$1'
1773
- - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4}) Build'
2034
+ - regex: '; {0,2}(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
1774
2035
  device_replacement: 'Archos $1'
1775
2036
  brand_replacement: 'Archos'
1776
2037
  model_replacement: '$1'
1777
- - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9) Build'
2038
+ - regex: '; {0,2}(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
1778
2039
  device_replacement: 'Archos $1'
1779
2040
  brand_replacement: 'Archos'
1780
2041
  model_replacement: '$1'
@@ -1783,11 +2044,11 @@ device_parsers:
1783
2044
  # A-rival
1784
2045
  # @ref: http://www.a-rival.de/de/
1785
2046
  #########
1786
- - regex: '; *(PAD-FMD[^;/]+) Build'
2047
+ - regex: '; {0,2}(PAD-FMD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1787
2048
  device_replacement: '$1'
1788
2049
  brand_replacement: 'Arival'
1789
2050
  model_replacement: '$1'
1790
- - regex: '; *(BioniQ) ?([^;/]+) Build'
2051
+ - regex: '; {0,2}(BioniQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1791
2052
  device_replacement: '$1 $2'
1792
2053
  brand_replacement: 'Arival'
1793
2054
  model_replacement: '$1 $2'
@@ -1796,11 +2057,11 @@ device_parsers:
1796
2057
  # Arnova
1797
2058
  # @ref: http://arnovatech.com/
1798
2059
  #########
1799
- - regex: '; *(AN\d[^;/]+|ARCHM\d+) Build'
2060
+ - regex: '; {0,2}(AN\d[^;/]{1,100}|ARCHM\d+)(?: Build|\) AppleWebKit)'
1800
2061
  device_replacement: 'Arnova $1'
1801
2062
  brand_replacement: 'Arnova'
1802
2063
  model_replacement: '$1'
1803
- - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+) Build'
2064
+ - regex: '; {0,2}(?:ARNOVA|Arnova) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1804
2065
  device_replacement: 'Arnova $1'
1805
2066
  brand_replacement: 'Arnova'
1806
2067
  model_replacement: '$1'
@@ -1809,7 +2070,7 @@ device_parsers:
1809
2070
  # Assistant
1810
2071
  # @ref: http://www.assistant.ua
1811
2072
  #########
1812
- - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build'
2073
+ - regex: '; {0,2}(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
1813
2074
  device_replacement: 'Assistant $1-$2'
1814
2075
  brand_replacement: 'Assistant'
1815
2076
  model_replacement: '$1-$2'
@@ -1818,11 +2079,11 @@ device_parsers:
1818
2079
  # Asus
1819
2080
  # @ref: http://www.asus.com/uk/Tablets_Mobile/
1820
2081
  #########
1821
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build'
2082
+ - regex: '; {0,2}(ME17\d[^;/]*|ME3\d{2}[^;/]{1,100}|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
1822
2083
  device_replacement: 'Asus $1'
1823
2084
  brand_replacement: 'Asus'
1824
2085
  model_replacement: '$1'
1825
- - regex: '; *ASUS[ _]*([^;/]+) Build'
2086
+ - regex: '; {0,2}ASUS[ _]{0,10}([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1826
2087
  device_replacement: 'Asus $1'
1827
2088
  brand_replacement: 'Asus'
1828
2089
  model_replacement: '$1'
@@ -1830,11 +2091,11 @@ device_parsers:
1830
2091
  #########
1831
2092
  # Garmin-Asus
1832
2093
  #########
1833
- - regex: '; *Garmin-Asus ([^;/]+) Build'
2094
+ - regex: '; {0,2}Garmin-Asus ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1834
2095
  device_replacement: 'Garmin-Asus $1'
1835
2096
  brand_replacement: 'Garmin-Asus'
1836
2097
  model_replacement: '$1'
1837
- - regex: '; *(Garminfone) Build'
2098
+ - regex: '; {0,2}(Garminfone)(?: Build|\) AppleWebKit)'
1838
2099
  device_replacement: 'Garmin $1'
1839
2100
  brand_replacement: 'Garmin-Asus'
1840
2101
  model_replacement: '$1'
@@ -1843,7 +2104,7 @@ device_parsers:
1843
2104
  # Attab
1844
2105
  # @ref: http://www.theattab.com/
1845
2106
  #########
1846
- - regex: '; (@TAB-[^;/]+) Build'
2107
+ - regex: '; (@TAB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1847
2108
  device_replacement: '$1'
1848
2109
  brand_replacement: 'Attab'
1849
2110
  model_replacement: '$1'
@@ -1853,7 +2114,7 @@ device_parsers:
1853
2114
  # @ref: ??
1854
2115
  # @note: Take care with Docomo T-01 Toshiba
1855
2116
  #########
1856
- - regex: '; *(T-(?:07|[^0]\d)[^;/]+) Build'
2117
+ - regex: '; {0,2}(T-(?:07|[^0]\d)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1857
2118
  device_replacement: '$1'
1858
2119
  brand_replacement: 'Audiosonic'
1859
2120
  model_replacement: '$1'
@@ -1862,7 +2123,7 @@ device_parsers:
1862
2123
  # Axioo
1863
2124
  # @ref: http://www.axiooworld.com/ww/index.php
1864
2125
  #########
1865
- - regex: '; *(?:Axioo[ _\-]([^;/]+)|(picopad)[ _\-]([^;/]+)) Build'
2126
+ - regex: '; {0,2}(?:Axioo[ _\-]([^;/]{1,100}?)|(picopad)[ _\-]([^;/]{1,100}?))(?: Build|\) AppleWebKit)'
1866
2127
  regex_flag: 'i'
1867
2128
  device_replacement: 'Axioo $1$2 $3'
1868
2129
  brand_replacement: 'Axioo'
@@ -1872,7 +2133,7 @@ device_parsers:
1872
2133
  # Azend
1873
2134
  # @ref: http://azendcorp.com/index.php/products/portable-electronics
1874
2135
  #########
1875
- - regex: '; *(V(?:100|700|800)[^;/]*) Build'
2136
+ - regex: '; {0,2}(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
1876
2137
  device_replacement: '$1'
1877
2138
  brand_replacement: 'Azend'
1878
2139
  model_replacement: '$1'
@@ -1881,7 +2142,7 @@ device_parsers:
1881
2142
  # Bak
1882
2143
  # @ref: http://www.bakinternational.com/produtos.php?cat=80
1883
2144
  #########
1884
- - regex: '; *(IBAK\-[^;/]*) Build'
2145
+ - regex: '; {0,2}(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
1885
2146
  regex_flag: 'i'
1886
2147
  device_replacement: '$1'
1887
2148
  brand_replacement: 'Bak'
@@ -1892,7 +2153,7 @@ device_parsers:
1892
2153
  # @ref: http://www.bedove.com/product.html
1893
2154
  # @models: HY6501|HY5001|X12|X21|I5
1894
2155
  #########
1895
- - regex: '; *(HY5001|HY6501|X12|X21|I5) Build'
2156
+ - regex: '; {0,2}(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
1896
2157
  device_replacement: 'Bedove $1'
1897
2158
  brand_replacement: 'Bedove'
1898
2159
  model_replacement: '$1'
@@ -1901,7 +2162,7 @@ device_parsers:
1901
2162
  # Benss
1902
2163
  # @ref: http://www.benss.net/
1903
2164
  #########
1904
- - regex: '; *(JC-[^;/]*) Build'
2165
+ - regex: '; {0,2}(JC-[^;/]*)(?: Build|\) AppleWebKit)'
1905
2166
  device_replacement: 'Benss $1'
1906
2167
  brand_replacement: 'Benss'
1907
2168
  model_replacement: '$1'
@@ -1911,7 +2172,7 @@ device_parsers:
1911
2172
  # @ref: http://uk.blackberry.com/
1912
2173
  # @note: Android Apps seams to be used here
1913
2174
  #########
1914
- - regex: '; *(BB) ([^;/]+) Build'
2175
+ - regex: '; {0,2}(BB) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1915
2176
  device_replacement: '$1 $2'
1916
2177
  brand_replacement: 'Blackberry'
1917
2178
  model_replacement: '$2'
@@ -1920,11 +2181,11 @@ device_parsers:
1920
2181
  # Blackbird
1921
2182
  # @ref: http://iblackbird.co.kr
1922
2183
  #########
1923
- - regex: '; *(BlackBird)[ _](I8.*) Build'
2184
+ - regex: '; {0,2}(BlackBird)[ _](I8.{0,200}?)(?: Build|\) AppleWebKit)'
1924
2185
  device_replacement: '$1 $2'
1925
2186
  brand_replacement: '$1'
1926
2187
  model_replacement: '$2'
1927
- - regex: '; *(BlackBird)[ _](.*) Build'
2188
+ - regex: '; {0,2}(BlackBird)[ _](.{0,200}?)(?: Build|\) AppleWebKit)'
1928
2189
  device_replacement: '$1 $2'
1929
2190
  brand_replacement: '$1'
1930
2191
  model_replacement: '$2'
@@ -1934,7 +2195,7 @@ device_parsers:
1934
2195
  # @ref: http://www.blaupunkt.com
1935
2196
  #########
1936
2197
  # Endeavour
1937
- - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+) Build'
2198
+ - regex: '; {0,2}([0-9]+BP[EM][^;/]*|Endeavour[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1938
2199
  device_replacement: 'Blaupunkt $1'
1939
2200
  brand_replacement: 'Blaupunkt'
1940
2201
  model_replacement: '$1'
@@ -1943,12 +2204,12 @@ device_parsers:
1943
2204
  # Blu
1944
2205
  # @ref: http://bluproducts.com
1945
2206
  #########
1946
- - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+) Build'
2207
+ - regex: '; {0,2}((?:BLU|Blu)[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1947
2208
  device_replacement: '$1$2'
1948
2209
  brand_replacement: 'Blu'
1949
2210
  model_replacement: '$2'
1950
2211
  # BMOBILE = operator branded device
1951
- - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5) Build'
2212
+ - regex: '; {0,2}(?:BMOBILE )?(Blu|BLU|DASH [^;/]{1,100}|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
1952
2213
  device_replacement: '$1'
1953
2214
  brand_replacement: 'Blu'
1954
2215
  model_replacement: '$1'
@@ -1958,7 +2219,7 @@ device_parsers:
1958
2219
  # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
1959
2220
  #########
1960
2221
  # tablet
1961
- - regex: '; *(TOUCH\d[^;/]+) Build'
2222
+ - regex: '; {0,2}(TOUCH\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1962
2223
  device_replacement: '$1'
1963
2224
  brand_replacement: 'Blusens'
1964
2225
  model_replacement: '$1'
@@ -1969,7 +2230,7 @@ device_parsers:
1969
2230
  # @note: Might collide with Maxx as AX is used also there.
1970
2231
  #########
1971
2232
  # smartphone
1972
- - regex: '; *(AX5\d+) Build'
2233
+ - regex: '; {0,2}(AX5\d+)(?: Build|\) AppleWebKit)'
1973
2234
  device_replacement: '$1'
1974
2235
  brand_replacement: 'Bmobile'
1975
2236
  model_replacement: '$1'
@@ -1978,11 +2239,11 @@ device_parsers:
1978
2239
  # bq
1979
2240
  # @ref: http://bqreaders.com
1980
2241
  #########
1981
- - regex: '; *([Bb]q) ([^;/]+);? Build'
2242
+ - regex: '; {0,2}([Bb]q) ([^;/]{1,100}?);?(?: Build|\) AppleWebKit)'
1982
2243
  device_replacement: '$1 $2'
1983
2244
  brand_replacement: 'bq'
1984
2245
  model_replacement: '$2'
1985
- - regex: '; *(Maxwell [^;/]+) Build'
2246
+ - regex: '; {0,2}(Maxwell [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1986
2247
  device_replacement: '$1'
1987
2248
  brand_replacement: 'bq'
1988
2249
  model_replacement: '$1'
@@ -1991,7 +2252,7 @@ device_parsers:
1991
2252
  # Braun Phototechnik
1992
2253
  # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
1993
2254
  #########
1994
- - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+) Build'
2255
+ - regex: '; {0,2}((?:B-Tab|B-TAB) ?\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1995
2256
  device_replacement: '$1'
1996
2257
  brand_replacement: 'Braun'
1997
2258
  model_replacement: '$1'
@@ -2000,7 +2261,7 @@ device_parsers:
2000
2261
  # Broncho
2001
2262
  # @ref: http://www.broncho.cn/
2002
2263
  #########
2003
- - regex: '; *(Broncho) ([^;/]+) Build'
2264
+ - regex: '; {0,2}(Broncho) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2004
2265
  device_replacement: '$1 $2'
2005
2266
  brand_replacement: '$1'
2006
2267
  model_replacement: '$2'
@@ -2009,7 +2270,7 @@ device_parsers:
2009
2270
  # Captiva
2010
2271
  # @ref: http://www.captiva-power.de
2011
2272
  #########
2012
- - regex: '; *CAPTIVA ([^;/]+) Build'
2273
+ - regex: '; {0,2}CAPTIVA ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2013
2274
  device_replacement: 'Captiva $1'
2014
2275
  brand_replacement: 'Captiva'
2015
2276
  model_replacement: '$1'
@@ -2018,7 +2279,7 @@ device_parsers:
2018
2279
  # Casio
2019
2280
  # @ref: http://www.casiogzone.com/
2020
2281
  #########
2021
- - regex: '; *(C771|CAL21|IS11CA) Build'
2282
+ - regex: '; {0,2}(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2022
2283
  device_replacement: '$1'
2023
2284
  brand_replacement: 'Casio'
2024
2285
  model_replacement: '$1'
@@ -2027,15 +2288,15 @@ device_parsers:
2027
2288
  # Cat
2028
2289
  # @ref: http://www.cat-sound.com
2029
2290
  #########
2030
- - regex: '; *(?:Cat|CAT) ([^;/]+) Build'
2291
+ - regex: '; {0,2}(?:Cat|CAT) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2031
2292
  device_replacement: 'Cat $1'
2032
2293
  brand_replacement: 'Cat'
2033
2294
  model_replacement: '$1'
2034
- - regex: '; *(?:Cat)(Nova.*) Build'
2295
+ - regex: '; {0,2}(?:Cat)(Nova.{0,200}?)(?: Build|\) AppleWebKit)'
2035
2296
  device_replacement: 'Cat $1'
2036
2297
  brand_replacement: 'Cat'
2037
2298
  model_replacement: '$1'
2038
- - regex: '; *(INM8002KP|ADM8000KP_[AB]) Build'
2299
+ - regex: '; {0,2}(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2039
2300
  device_replacement: '$1'
2040
2301
  brand_replacement: 'Cat'
2041
2302
  model_replacement: 'Tablet PHOENIX 8.1J0'
@@ -2045,7 +2306,7 @@ device_parsers:
2045
2306
  # @ref: http://www.celkonmobiles.com/?_a=products
2046
2307
  # @models: A10, A19Q, A101, A105, A107, A107\+, A112, A118, A119, A119Q, A15, A19, A20, A200, A220, A225, A22 Race, A27, A58, A59, A60, A62, A63, A64, A66, A67, A69, A75, A77, A79, A8\+, A83, A85, A86, A87, A89 Ultima, A9\+, A90, A900, A95, A97i, A98, AR 40, AR 45, AR 50, ML5
2047
2308
  #########
2048
- - regex: '; *(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2309
+ - regex: '; {0,2}(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2049
2310
  device_replacement: '$1'
2050
2311
  brand_replacement: 'Celkon'
2051
2312
  model_replacement: '$1'
@@ -2053,12 +2314,12 @@ device_parsers:
2053
2314
  device_replacement: '$1'
2054
2315
  brand_replacement: 'Celkon'
2055
2316
  model_replacement: '$1'
2056
- - regex: '; *(CT)-?(\d+) Build'
2317
+ - regex: '; {0,2}(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2057
2318
  device_replacement: '$1$2'
2058
2319
  brand_replacement: 'Celkon'
2059
2320
  model_replacement: '$1$2'
2060
2321
  # smartphones
2061
- - regex: '; *(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2322
+ - regex: '; {0,2}(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2062
2323
  device_replacement: '$1'
2063
2324
  brand_replacement: 'Celkon'
2064
2325
  model_replacement: '$1'
@@ -2069,7 +2330,7 @@ device_parsers:
2069
2330
  # @brief: China manufacturer makes tablets for different small brands
2070
2331
  # (eg. http://www.zeepad.net/index.html)
2071
2332
  #########
2072
- - regex: '; *(TPC[0-9]{4,5}) Build'
2333
+ - regex: '; {0,2}(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2073
2334
  device_replacement: '$1'
2074
2335
  brand_replacement: 'ChangJia'
2075
2336
  model_replacement: '$1'
@@ -2078,15 +2339,15 @@ device_parsers:
2078
2339
  # Cloudfone
2079
2340
  # @ref: http://www.cloudfonemobile.com/
2080
2341
  #########
2081
- - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+) Build'
2342
+ - regex: '; {0,2}(Cloudfone)[ _](Excite)([^ ][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2082
2343
  device_replacement: '$1 $2 $3'
2083
2344
  brand_replacement: 'Cloudfone'
2084
2345
  model_replacement: '$1 $2 $3'
2085
- - regex: '; *(Excite|ICE)[ _](\d+[^;/]+) Build'
2346
+ - regex: '; {0,2}(Excite|ICE)[ _](\d+[^;/]{0,100}?)(?: Build|\) AppleWebKit)'
2086
2347
  device_replacement: 'Cloudfone $1 $2'
2087
2348
  brand_replacement: 'Cloudfone'
2088
2349
  model_replacement: 'Cloudfone $1 $2'
2089
- - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+) Build'
2350
+ - regex: '; {0,2}(Cloudfone|CloudPad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2090
2351
  device_replacement: '$1 $2'
2091
2352
  brand_replacement: 'Cloudfone'
2092
2353
  model_replacement: '$1 $2'
@@ -2095,7 +2356,7 @@ device_parsers:
2095
2356
  # Cmx
2096
2357
  # @ref: http://cmx.at/de/
2097
2358
  #########
2098
- - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+) Build'
2359
+ - regex: '; {0,2}((?:Aquila|Clanga|Rapax)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2099
2360
  regex_flag: 'i'
2100
2361
  device_replacement: '$1'
2101
2362
  brand_replacement: 'Cmx'
@@ -2106,7 +2367,7 @@ device_parsers:
2106
2367
  # @ref: http://cobykyros.com
2107
2368
  # @note: Be careful with MID\d{3} from MpMan or Manta
2108
2369
  #########
2109
- - regex: '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\)])'
2370
+ - regex: '; {0,2}(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? {0,2}(?:Build|[;\)])'
2110
2371
  device_replacement: 'CobyKyros $1$2'
2111
2372
  brand_replacement: 'CobyKyros'
2112
2373
  model_replacement: '$1$2'
@@ -2115,7 +2376,7 @@ device_parsers:
2115
2376
  # Coolpad
2116
2377
  # @ref: ??
2117
2378
  #########
2118
- - regex: '; *([^;/]*)Coolpad[ _]([^;/]+) Build'
2379
+ - regex: '; {0,2}([^;/]{0,50})Coolpad[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2119
2380
  device_replacement: '$1$2'
2120
2381
  brand_replacement: 'Coolpad'
2121
2382
  model_replacement: '$1$2'
@@ -2124,7 +2385,7 @@ device_parsers:
2124
2385
  # Cube
2125
2386
  # @ref: http://www.cube-tablet.com/buy-products.html
2126
2387
  #########
2127
- - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*|A5300) Build'
2388
+ - regex: '; {0,2}(CUBE[ _])?([KU][0-9]+ ?GT.{0,200}?|A5300)(?: Build|\) AppleWebKit)'
2128
2389
  regex_flag: 'i'
2129
2390
  device_replacement: '$1$2'
2130
2391
  brand_replacement: 'Cube'
@@ -2134,12 +2395,12 @@ device_parsers:
2134
2395
  # Cubot
2135
2396
  # @ref: http://www.cubotmall.com/
2136
2397
  #########
2137
- - regex: '; *CUBOT ([^;/]+) Build'
2398
+ - regex: '; {0,2}CUBOT ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2138
2399
  regex_flag: 'i'
2139
2400
  device_replacement: '$1'
2140
2401
  brand_replacement: 'Cubot'
2141
2402
  model_replacement: '$1'
2142
- - regex: '; *(BOBBY) Build'
2403
+ - regex: '; {0,2}(BOBBY)(?: Build|\) AppleWebKit)'
2143
2404
  regex_flag: 'i'
2144
2405
  device_replacement: '$1'
2145
2406
  brand_replacement: 'Cubot'
@@ -2149,7 +2410,7 @@ device_parsers:
2149
2410
  # Danew
2150
2411
  # @ref: http://www.danew.com/produits-tablette.php
2151
2412
  #########
2152
- - regex: '; *(Dslide [^;/]+) Build'
2413
+ - regex: '; {0,2}(Dslide [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2153
2414
  device_replacement: '$1'
2154
2415
  brand_replacement: 'Danew'
2155
2416
  model_replacement: '$1'
@@ -2163,39 +2424,39 @@ device_parsers:
2163
2424
  # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
2164
2425
  # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
2165
2426
  #########
2166
- - regex: '; *(XCD)[ _]?(28|35) Build'
2427
+ - regex: '; {0,2}(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2167
2428
  device_replacement: 'Dell $1$2'
2168
2429
  brand_replacement: 'Dell'
2169
2430
  model_replacement: '$1$2'
2170
- - regex: '; *(001DL) Build'
2431
+ - regex: '; {0,2}(001DL)(?: Build|\) AppleWebKit)'
2171
2432
  device_replacement: 'Dell $1'
2172
2433
  brand_replacement: 'Dell'
2173
2434
  model_replacement: 'Streak'
2174
- - regex: '; *(?:Dell|DELL) (Streak) Build'
2435
+ - regex: '; {0,2}(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2175
2436
  device_replacement: 'Dell $1'
2176
2437
  brand_replacement: 'Dell'
2177
2438
  model_replacement: 'Streak'
2178
- - regex: '; *(101DL|GS01|Streak Pro[^;/]*) Build'
2439
+ - regex: '; {0,2}(101DL|GS01|Streak Pro[^;/]{0,100})(?: Build|\) AppleWebKit)'
2179
2440
  device_replacement: 'Dell $1'
2180
2441
  brand_replacement: 'Dell'
2181
2442
  model_replacement: 'Streak Pro'
2182
- - regex: '; *([Ss]treak ?7) Build'
2443
+ - regex: '; {0,2}([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2183
2444
  device_replacement: 'Dell $1'
2184
2445
  brand_replacement: 'Dell'
2185
2446
  model_replacement: 'Streak 7'
2186
- - regex: '; *(Mini-3iX) Build'
2447
+ - regex: '; {0,2}(Mini-3iX)(?: Build|\) AppleWebKit)'
2187
2448
  device_replacement: 'Dell $1'
2188
2449
  brand_replacement: 'Dell'
2189
2450
  model_replacement: '$1'
2190
- - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*|Streak[ _]Pro) Build'
2451
+ - regex: '; {0,2}(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.{0,200}?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2191
2452
  device_replacement: 'Dell $1'
2192
2453
  brand_replacement: 'Dell'
2193
2454
  model_replacement: '$1'
2194
- - regex: '; *Dell[ _]([^;/]+) Build'
2455
+ - regex: '; {0,2}Dell[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2195
2456
  device_replacement: 'Dell $1'
2196
2457
  brand_replacement: 'Dell'
2197
2458
  model_replacement: '$1'
2198
- - regex: '; *Dell ([^;/]+) Build'
2459
+ - regex: '; {0,2}Dell ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2199
2460
  device_replacement: 'Dell $1'
2200
2461
  brand_replacement: 'Dell'
2201
2462
  model_replacement: '$1'
@@ -2204,7 +2465,7 @@ device_parsers:
2204
2465
  # Denver
2205
2466
  # @ref: http://www.denver-electronics.com/tablets1/
2206
2467
  #########
2207
- - regex: '; *(TA[CD]-\d+[^;/]*) Build'
2468
+ - regex: '; {0,2}(TA[CD]-\d+[^;/]{0,100})(?: Build|\) AppleWebKit)'
2208
2469
  device_replacement: '$1'
2209
2470
  brand_replacement: 'Denver'
2210
2471
  model_replacement: '$1'
@@ -2213,7 +2474,7 @@ device_parsers:
2213
2474
  # Dex
2214
2475
  # @ref: http://dex.ua/
2215
2476
  #########
2216
- - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?) Build'
2477
+ - regex: '; {0,2}(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2217
2478
  device_replacement: '$1'
2218
2479
  brand_replacement: 'Dex'
2219
2480
  model_replacement: '$1'
@@ -2222,7 +2483,7 @@ device_parsers:
2222
2483
  # DNS AirTab
2223
2484
  # @ref: http://www.dns-shop.ru/
2224
2485
  #########
2225
- - regex: '; *(AirTab)[ _\-]([^;/]+) Build'
2486
+ - regex: '; {0,2}(AirTab)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2226
2487
  device_replacement: '$1 $2'
2227
2488
  brand_replacement: 'DNS'
2228
2489
  model_replacement: '$1 $2'
@@ -2231,43 +2492,43 @@ device_parsers:
2231
2492
  # Docomo (Operator Branded Device)
2232
2493
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2233
2494
  #########
2234
- - regex: '; *(F\-\d[^;/]+) Build'
2495
+ - regex: '; {0,2}(F\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2235
2496
  device_replacement: '$1'
2236
2497
  brand_replacement: 'Fujitsu'
2237
2498
  model_replacement: '$1'
2238
- - regex: '; *(HT-03A) Build'
2499
+ - regex: '; {0,2}(HT-03A)(?: Build|\) AppleWebKit)'
2239
2500
  device_replacement: '$1'
2240
2501
  brand_replacement: 'HTC'
2241
2502
  model_replacement: 'Magic'
2242
- - regex: '; *(HT\-\d[^;/]+) Build'
2503
+ - regex: '; {0,2}(HT\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2243
2504
  device_replacement: '$1'
2244
2505
  brand_replacement: 'HTC'
2245
2506
  model_replacement: '$1'
2246
- - regex: '; *(L\-\d[^;/]+) Build'
2507
+ - regex: '; {0,2}(L\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2247
2508
  device_replacement: '$1'
2248
2509
  brand_replacement: 'LG'
2249
2510
  model_replacement: '$1'
2250
- - regex: '; *(N\-\d[^;/]+) Build'
2511
+ - regex: '; {0,2}(N\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2251
2512
  device_replacement: '$1'
2252
2513
  brand_replacement: 'Nec'
2253
2514
  model_replacement: '$1'
2254
- - regex: '; *(P\-\d[^;/]+) Build'
2515
+ - regex: '; {0,2}(P\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2255
2516
  device_replacement: '$1'
2256
2517
  brand_replacement: 'Panasonic'
2257
2518
  model_replacement: '$1'
2258
- - regex: '; *(SC\-\d[^;/]+) Build'
2519
+ - regex: '; {0,2}(SC\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2259
2520
  device_replacement: '$1'
2260
2521
  brand_replacement: 'Samsung'
2261
2522
  model_replacement: '$1'
2262
- - regex: '; *(SH\-\d[^;/]+) Build'
2523
+ - regex: '; {0,2}(SH\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2263
2524
  device_replacement: '$1'
2264
2525
  brand_replacement: 'Sharp'
2265
2526
  model_replacement: '$1'
2266
- - regex: '; *(SO\-\d[^;/]+) Build'
2527
+ - regex: '; {0,2}(SO\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2267
2528
  device_replacement: '$1'
2268
2529
  brand_replacement: 'SonyEricsson'
2269
2530
  model_replacement: '$1'
2270
- - regex: '; *(T\-0[12][^;/]+) Build'
2531
+ - regex: '; {0,2}(T\-0[12][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2271
2532
  device_replacement: '$1'
2272
2533
  brand_replacement: 'Toshiba'
2273
2534
  model_replacement: '$1'
@@ -2276,7 +2537,7 @@ device_parsers:
2276
2537
  # DOOV
2277
2538
  # @ref: http://www.doov.com.cn/
2278
2539
  #########
2279
- - regex: '; *(DOOV)[ _]([^;/]+) Build'
2540
+ - regex: '; {0,2}(DOOV)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2280
2541
  device_replacement: '$1 $2'
2281
2542
  brand_replacement: 'DOOV'
2282
2543
  model_replacement: '$2'
@@ -2285,7 +2546,7 @@ device_parsers:
2285
2546
  # Enot
2286
2547
  # @ref: http://www.enot.ua/
2287
2548
  #########
2288
- - regex: '; *(Enot|ENOT)[ -]?([^;/]+) Build'
2549
+ - regex: '; {0,2}(Enot|ENOT)[ -]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2289
2550
  device_replacement: '$1 $2'
2290
2551
  brand_replacement: 'Enot'
2291
2552
  model_replacement: '$2'
@@ -2294,11 +2555,11 @@ device_parsers:
2294
2555
  # Evercoss
2295
2556
  # @ref: http://evercoss.com/android/
2296
2557
  #########
2297
- - regex: '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2558
+ - regex: '; {0,2}[^;/]{1,100} Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2298
2559
  device_replacement: 'CROSS $1'
2299
2560
  brand_replacement: 'Evercoss'
2300
2561
  model_replacement: 'Cross $1'
2301
- - regex: '; *(CROSS|Cross)[ _\-]([^;/]+) Build'
2562
+ - regex: '; {0,2}(CROSS|Cross)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2302
2563
  device_replacement: '$1 $2'
2303
2564
  brand_replacement: 'Evercoss'
2304
2565
  model_replacement: 'Cross $2'
@@ -2307,7 +2568,7 @@ device_parsers:
2307
2568
  # Explay
2308
2569
  # @ref: http://explay.ru/
2309
2570
  #########
2310
- - regex: '; *Explay[_ ](.+?)(?:[\)]| Build)'
2571
+ - regex: '; {0,2}Explay[_ ](.{1,200}?)(?:[\)]| Build)'
2311
2572
  device_replacement: '$1'
2312
2573
  brand_replacement: 'Explay'
2313
2574
  model_replacement: '$1'
@@ -2316,11 +2577,11 @@ device_parsers:
2316
2577
  # Fly
2317
2578
  # @ref: http://www.fly-phone.com/
2318
2579
  #########
2319
- - regex: '; *(IQ.*) Build'
2580
+ - regex: '; {0,2}(IQ.{0,200}?)(?: Build|\) AppleWebKit)'
2320
2581
  device_replacement: '$1'
2321
2582
  brand_replacement: 'Fly'
2322
2583
  model_replacement: '$1'
2323
- - regex: '; *(Fly|FLY)[ _](IQ[^;]+|F[34]\d+[^;]*);? Build'
2584
+ - regex: '; {0,2}(Fly|FLY)[ _](IQ[^;]{1,100}?|F[34]\d+[^;]{0,100}?);?(?: Build|\) AppleWebKit)'
2324
2585
  device_replacement: '$1 $2'
2325
2586
  brand_replacement: 'Fly'
2326
2587
  model_replacement: '$2'
@@ -2329,7 +2590,7 @@ device_parsers:
2329
2590
  # Fujitsu
2330
2591
  # @ref: http://www.fujitsu.com/global/
2331
2592
  #########
2332
- - regex: '; *(M532|Q572|FJL21) Build/'
2593
+ - regex: '; {0,2}(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2333
2594
  device_replacement: '$1'
2334
2595
  brand_replacement: 'Fujitsu'
2335
2596
  model_replacement: '$1'
@@ -2338,7 +2599,7 @@ device_parsers:
2338
2599
  # Galapad
2339
2600
  # @ref: http://www.galapad.net/product.html
2340
2601
  #########
2341
- - regex: '; *(G1) Build'
2602
+ - regex: '; {0,2}(G1)(?: Build|\) AppleWebKit)'
2342
2603
  device_replacement: '$1'
2343
2604
  brand_replacement: 'Galapad'
2344
2605
  model_replacement: '$1'
@@ -2347,7 +2608,7 @@ device_parsers:
2347
2608
  # Geeksphone
2348
2609
  # @ref: http://www.geeksphone.com/
2349
2610
  #########
2350
- - regex: '; *(Geeksphone) ([^;/]+) Build'
2611
+ - regex: '; {0,2}(Geeksphone) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2351
2612
  device_replacement: '$1 $2'
2352
2613
  brand_replacement: '$1'
2353
2614
  model_replacement: '$2'
@@ -2356,8 +2617,7 @@ device_parsers:
2356
2617
  # Gfive
2357
2618
  # @ref: http://www.gfivemobile.com/en
2358
2619
  #########
2359
- #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
2360
- - regex: '; *(G[^F]?FIVE) ([^;/]+) Build'
2620
+ - regex: '; {0,2}(G[^F]?FIVE) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2361
2621
  device_replacement: '$1 $2'
2362
2622
  brand_replacement: 'Gfive'
2363
2623
  model_replacement: '$2'
@@ -2366,16 +2626,16 @@ device_parsers:
2366
2626
  # Gionee
2367
2627
  # @ref: http://www.gionee.com/
2368
2628
  #########
2369
- - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+|) Build'
2629
+ - regex: '; {0,2}(Gionee)[ _\-]([^;/]{1,100}?)(?:/[^;/]{1,100}|)(?: Build|\) AppleWebKit)'
2370
2630
  regex_flag: 'i'
2371
2631
  device_replacement: '$1 $2'
2372
2632
  brand_replacement: 'Gionee'
2373
2633
  model_replacement: '$2'
2374
- - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1) Build'
2634
+ - regex: '; {0,2}(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2375
2635
  device_replacement: 'Gionee $1'
2376
2636
  brand_replacement: 'Gionee'
2377
2637
  model_replacement: '$1'
2378
- - regex: '; *(E3) Build/JOP40D'
2638
+ - regex: '; {0,2}(E3) Build/JOP40D'
2379
2639
  device_replacement: 'Gionee $1'
2380
2640
  brand_replacement: 'Gionee'
2381
2641
  model_replacement: '$1'
@@ -2389,11 +2649,11 @@ device_parsers:
2389
2649
  # GoClever
2390
2650
  # @ref: http://www.goclever.com
2391
2651
  #########
2392
- - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB) Build'
2652
+ - regex: '; {0,2}((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]{0,100}|PLAYTAB)(?: Build|\) AppleWebKit)'
2393
2653
  device_replacement: 'GoClever $1'
2394
2654
  brand_replacement: 'GoClever'
2395
2655
  model_replacement: '$1'
2396
- - regex: '; *GOCLEVER ([^;/]+) Build'
2656
+ - regex: '; {0,2}GOCLEVER ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2397
2657
  device_replacement: 'GoClever $1'
2398
2658
  brand_replacement: 'GoClever'
2399
2659
  model_replacement: '$1'
@@ -2402,11 +2662,11 @@ device_parsers:
2402
2662
  # Google
2403
2663
  # @ref: http://www.google.de/glass/start/
2404
2664
  #########
2405
- - regex: '; *(Glass \d+) Build'
2665
+ - regex: '; {0,2}(Glass \d+)(?: Build|\) AppleWebKit)'
2406
2666
  device_replacement: '$1'
2407
2667
  brand_replacement: 'Google'
2408
2668
  model_replacement: '$1'
2409
- - regex: '; *(Pixel.*) Build'
2669
+ - regex: '; {0,2}(Pixel.{0,200}?)(?: Build|\) AppleWebKit)'
2410
2670
  device_replacement: '$1'
2411
2671
  brand_replacement: 'Google'
2412
2672
  model_replacement: '$1'
@@ -2415,7 +2675,7 @@ device_parsers:
2415
2675
  # Gigabyte
2416
2676
  # @ref: http://gsmart.gigabytecm.com/en/
2417
2677
  #########
2418
- - regex: '; *(GSmart)[ -]([^/]+) Build'
2678
+ - regex: '; {0,2}(GSmart)[ -]([^/]{1,50})(?: Build|\) AppleWebKit)'
2419
2679
  device_replacement: '$1 $2'
2420
2680
  brand_replacement: 'Gigabyte'
2421
2681
  model_replacement: '$1 $2'
@@ -2424,7 +2684,7 @@ device_parsers:
2424
2684
  # Freescale development boards
2425
2685
  # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
2426
2686
  #########
2427
- - regex: '; *(imx5[13]_[^/]+) Build'
2687
+ - regex: '; {0,2}(imx5[13]_[^/]{1,50})(?: Build|\) AppleWebKit)'
2428
2688
  device_replacement: 'Freescale $1'
2429
2689
  brand_replacement: 'Freescale'
2430
2690
  model_replacement: '$1'
@@ -2434,11 +2694,11 @@ device_parsers:
2434
2694
  # @ref: http://www.haier.com/
2435
2695
  # @ref: http://www.haier.com/de/produkte/tablet/
2436
2696
  #########
2437
- - regex: '; *Haier[ _\-]([^/]+) Build'
2697
+ - regex: '; {0,2}Haier[ _\-]([^/]{1,50})(?: Build|\) AppleWebKit)'
2438
2698
  device_replacement: 'Haier $1'
2439
2699
  brand_replacement: 'Haier'
2440
2700
  model_replacement: '$1'
2441
- - regex: '; *(PAD1016) Build'
2701
+ - regex: '; {0,2}(PAD1016)(?: Build|\) AppleWebKit)'
2442
2702
  device_replacement: 'Haipad $1'
2443
2703
  brand_replacement: 'Haipad'
2444
2704
  model_replacement: '$1'
@@ -2448,7 +2708,7 @@ device_parsers:
2448
2708
  # @ref: http://www.haipad.net/
2449
2709
  # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
2450
2710
  #########
2451
- - regex: '; *(M701|M7|M8|M9) Build'
2711
+ - regex: '; {0,2}(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2452
2712
  device_replacement: 'Haipad $1'
2453
2713
  brand_replacement: 'Haipad'
2454
2714
  model_replacement: '$1'
@@ -2458,7 +2718,7 @@ device_parsers:
2458
2718
  # @ref: http://www.hannspree.eu/
2459
2719
  # @models: SN10T1|SN10T2|SN70T31B|SN70T32W
2460
2720
  #########
2461
- - regex: '; *(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2721
+ - regex: '; {0,2}(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2462
2722
  device_replacement: 'Hannspree $1'
2463
2723
  brand_replacement: 'Hannspree'
2464
2724
  model_replacement: '$1'
@@ -2467,11 +2727,11 @@ device_parsers:
2467
2727
  # HCLme
2468
2728
  # @ref: http://www.hclmetablet.com/india/
2469
2729
  #########
2470
- - regex: 'Build/HCL ME Tablet ([^;\)]+)[\);]'
2730
+ - regex: 'Build/HCL ME Tablet ([^;\)]{1,3})[\);]'
2471
2731
  device_replacement: 'HCLme $1'
2472
2732
  brand_replacement: 'HCLme'
2473
2733
  model_replacement: '$1'
2474
- - regex: '; *([^;\/]+) Build/HCL'
2734
+ - regex: '; {0,2}([^;\/]+) Build/HCL'
2475
2735
  device_replacement: 'HCLme $1'
2476
2736
  brand_replacement: 'HCLme'
2477
2737
  model_replacement: '$1'
@@ -2480,7 +2740,7 @@ device_parsers:
2480
2740
  # Hena
2481
2741
  # @ref: http://www.henadigital.com/en/product/index.asp?id=6
2482
2742
  #########
2483
- - regex: '; *(MID-?\d{4}C[EM]) Build'
2743
+ - regex: '; {0,2}(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2484
2744
  device_replacement: 'Hena $1'
2485
2745
  brand_replacement: 'Hena'
2486
2746
  model_replacement: '$1'
@@ -2489,11 +2749,11 @@ device_parsers:
2489
2749
  # Hisense
2490
2750
  # @ref: http://www.hisense.com/
2491
2751
  #########
2492
- - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+) Build'
2752
+ - regex: '; {0,2}(EG\d{2,}|HS-[^;/]{1,100}|MIRA[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2493
2753
  device_replacement: 'Hisense $1'
2494
2754
  brand_replacement: 'Hisense'
2495
2755
  model_replacement: '$1'
2496
- - regex: '; *(andromax[^;/]+) Build'
2756
+ - regex: '; {0,2}(andromax[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2497
2757
  regex_flag: 'i'
2498
2758
  device_replacement: 'Hisense $1'
2499
2759
  brand_replacement: 'Hisense'
@@ -2503,7 +2763,7 @@ device_parsers:
2503
2763
  # hitech
2504
2764
  # @ref: http://www.hitech-mobiles.com/
2505
2765
  #########
2506
- - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE) Build'
2766
+ - regex: '; {0,2}(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2507
2767
  device_replacement: 'AMAZE $1$2'
2508
2768
  brand_replacement: 'hitech'
2509
2769
  model_replacement: 'AMAZE $1$2'
@@ -2512,15 +2772,15 @@ device_parsers:
2512
2772
  # HP
2513
2773
  # @ref: http://www.hp.com/
2514
2774
  #########
2515
- - regex: '; *(PlayBook) Build'
2775
+ - regex: '; {0,2}(PlayBook)(?: Build|\) AppleWebKit)'
2516
2776
  device_replacement: 'HP $1'
2517
2777
  brand_replacement: 'HP'
2518
2778
  model_replacement: '$1'
2519
- - regex: '; *HP ([^/]+) Build'
2779
+ - regex: '; {0,2}HP ([^/]{1,50})(?: Build|\) AppleWebKit)'
2520
2780
  device_replacement: 'HP $1'
2521
2781
  brand_replacement: 'HP'
2522
2782
  model_replacement: '$1'
2523
- - regex: '; *([^/]+_tenderloin) Build'
2783
+ - regex: '; {0,2}([^/]{1,30}_tenderloin)(?: Build|\) AppleWebKit)'
2524
2784
  device_replacement: 'HP TouchPad'
2525
2785
  brand_replacement: 'HP'
2526
2786
  model_replacement: 'TouchPad'
@@ -2530,62 +2790,66 @@ device_parsers:
2530
2790
  # @ref: http://www.huaweidevice.com
2531
2791
  # @note: Needs to be before HTC due to Desire HD Build on U8815
2532
2792
  #########
2533
- - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2793
+ - regex: '; {0,2}(HUAWEI |Huawei-|)([UY][^;/]{1,100}) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2534
2794
  device_replacement: '$1$2'
2535
2795
  brand_replacement: 'Huawei'
2536
2796
  model_replacement: '$2'
2537
- - regex: '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)[^\);]*\)'
2797
+ - regex: '; {0,2}([^;/]{1,100}) Build[/ ]Huawei(MT1-U06|[A-Z]{1,50}\d+[^\);]{1,50})\)'
2538
2798
  device_replacement: '$1'
2539
2799
  brand_replacement: 'Huawei'
2540
2800
  model_replacement: '$2'
2541
- - regex: '; *(S7|M860) Build'
2801
+ - regex: '; {0,2}(S7|M860) Build'
2542
2802
  device_replacement: '$1'
2543
2803
  brand_replacement: 'Huawei'
2544
2804
  model_replacement: '$1'
2545
- - regex: '; *((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2805
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2546
2806
  device_replacement: '$1$2'
2547
2807
  brand_replacement: 'Huawei'
2548
2808
  model_replacement: '$2'
2549
- - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
2809
+ - regex: '; {0,2}((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]{1,100}) Build'
2550
2810
  device_replacement: '$1$2'
2551
2811
  brand_replacement: 'Huawei'
2552
2812
  model_replacement: '$2'
2553
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]+) Build'
2813
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]{1,100}) Build'
2554
2814
  device_replacement: '$1$2'
2555
2815
  brand_replacement: 'Huawei'
2556
2816
  model_replacement: '$2'
2557
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)([^;/]+) Build'
2817
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)([^;/]{1,100}) Build'
2558
2818
  device_replacement: '$1$2'
2559
2819
  brand_replacement: 'Huawei'
2560
2820
  model_replacement: '$2'
2561
- - regex: '; *(MediaPad[^;]+|SpringBoard) Build/Huawei'
2821
+ - regex: '; {0,2}(MediaPad[^;]{1,200}|SpringBoard) Build/Huawei'
2562
2822
  device_replacement: '$1'
2563
2823
  brand_replacement: 'Huawei'
2564
2824
  model_replacement: '$1'
2565
- - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
2825
+ - regex: '; {0,2}([^;]{1,200}) Build/(?:Huawei|HUAWEI)'
2566
2826
  device_replacement: '$1'
2567
2827
  brand_replacement: 'Huawei'
2568
2828
  model_replacement: '$1'
2569
- - regex: '; *([Uu])([89]\d{3}) Build'
2829
+ - regex: '; {0,2}([Uu])([89]\d{3}) Build'
2570
2830
  device_replacement: '$1$2'
2571
2831
  brand_replacement: 'Huawei'
2572
2832
  model_replacement: 'U$2'
2573
- - regex: '; *(?:Ideos |IDEOS )(S7) Build'
2833
+ - regex: '; {0,2}(?:Ideos |IDEOS )(S7) Build'
2574
2834
  device_replacement: 'Huawei Ideos$1'
2575
2835
  brand_replacement: 'Huawei'
2576
2836
  model_replacement: 'Ideos$1'
2577
- - regex: '; *(?:Ideos |IDEOS )([^;/]+\s*|\s*)Build'
2837
+ - regex: '; {0,2}(?:Ideos |IDEOS )([^;/]{1,50}\s{0,5}|\s{0,5})Build'
2578
2838
  device_replacement: 'Huawei Ideos$1'
2579
2839
  brand_replacement: 'Huawei'
2580
2840
  model_replacement: 'Ideos$1'
2581
- - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]'
2841
+ - regex: '; {0,2}(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.{1,200}?) Build[/ ]'
2582
2842
  device_replacement: 'Huawei $1'
2583
2843
  brand_replacement: 'Huawei'
2584
2844
  model_replacement: '$1'
2585
- - regex: '; *((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2845
+ - regex: '; {0,2}((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2586
2846
  device_replacement: 'Huawei $1'
2587
2847
  brand_replacement: 'Huawei'
2588
2848
  model_replacement: '$1'
2849
+ - regex: '; {0,2}([^;]{1,200}) Build/(HONOR|Honor)'
2850
+ device_replacement: 'Huawei Honor $1'
2851
+ brand_replacement: 'Huawei'
2852
+ model_replacement: 'Honor $1'
2589
2853
 
2590
2854
  #########
2591
2855
  # HTC
@@ -2593,7 +2857,7 @@ device_parsers:
2593
2857
  # @ref: http://en.wikipedia.org/wiki/List_of_HTC_phones
2594
2858
  #########
2595
2859
 
2596
- - regex: '; *HTC[ _]([^;]+); Windows Phone'
2860
+ - regex: '; {0,2}HTC[ _]([^;]{1,200}); Windows Phone'
2597
2861
  device_replacement: 'HTC $1'
2598
2862
  brand_replacement: 'HTC'
2599
2863
  model_replacement: '$1'
@@ -2601,59 +2865,59 @@ device_parsers:
2601
2865
  # Android HTC with Version Number matcher
2602
2866
  # ; HTC_0P3Z11/1.12.161.3 Build
2603
2867
  # ;HTC_A3335 V2.38.841.1 Build
2604
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2868
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2605
2869
  device_replacement: 'HTC $1'
2606
2870
  brand_replacement: 'HTC'
2607
2871
  model_replacement: '$1'
2608
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2872
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2609
2873
  device_replacement: 'HTC $1 $2'
2610
2874
  brand_replacement: 'HTC'
2611
2875
  model_replacement: '$1 $2'
2612
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2876
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2613
2877
  device_replacement: 'HTC $1 $2 $3'
2614
2878
  brand_replacement: 'HTC'
2615
2879
  model_replacement: '$1 $2 $3'
2616
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2880
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2617
2881
  device_replacement: 'HTC $1 $2 $3 $4'
2618
2882
  brand_replacement: 'HTC'
2619
2883
  model_replacement: '$1 $2 $3 $4'
2620
2884
 
2621
2885
  # Android HTC without Version Number matcher
2622
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
2886
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: {0,2}Build|[;\)]| - )'
2623
2887
  device_replacement: 'HTC $1'
2624
2888
  brand_replacement: 'HTC'
2625
2889
  model_replacement: '$1'
2626
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
2890
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: {0,2}Build|[;\)]| - )'
2627
2891
  device_replacement: 'HTC $1 $2'
2628
2892
  brand_replacement: 'HTC'
2629
2893
  model_replacement: '$1 $2'
2630
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
2894
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: {0,2}Build|[;\)]| - )'
2631
2895
  device_replacement: 'HTC $1 $2 $3'
2632
2896
  brand_replacement: 'HTC'
2633
2897
  model_replacement: '$1 $2 $3'
2634
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
2898
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: {0,2}Build|[;\)]| - )'
2635
2899
  device_replacement: 'HTC $1 $2 $3 $4'
2636
2900
  brand_replacement: 'HTC'
2637
2901
  model_replacement: '$1 $2 $3 $4'
2638
2902
 
2639
2903
  # HTC Streaming Player
2640
- - regex: 'HTC Streaming Player [^\/]*/[^\/]*/ htc_([^/]+) /'
2904
+ - regex: 'HTC Streaming Player [^\/]{0,30}/[^\/]{0,10}/ htc_([^/]{1,10}) /'
2641
2905
  device_replacement: 'HTC $1'
2642
2906
  brand_replacement: 'HTC'
2643
2907
  model_replacement: '$1'
2644
2908
  # general matcher for anything else
2645
- - regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2909
+ - regex: '(?:[;,] {0,2}|^)(?:htccn_chs-|)HTC[ _-]?([^;]{1,200}?)(?: {0,2}Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2646
2910
  regex_flag: 'i'
2647
2911
  device_replacement: 'HTC $1'
2648
2912
  brand_replacement: 'HTC'
2649
2913
  model_replacement: '$1'
2650
2914
  # Android matchers without HTC
2651
- - regex: '; *(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
2915
+ - regex: '; {0,2}(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
2652
2916
  regex_flag: 'i'
2653
2917
  device_replacement: 'HTC $1'
2654
2918
  brand_replacement: 'HTC'
2655
2919
  model_replacement: '$1'
2656
- - regex: '; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\)]|Build|MIUI|1\.0)'
2920
+ - regex: '; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\)]|Build|MIUI|1\.0)'
2657
2921
  regex_flag: 'i'
2658
2922
  device_replacement: 'HTC $1 $2'
2659
2923
  brand_replacement: 'HTC'
@@ -2663,16 +2927,16 @@ device_parsers:
2663
2927
  # Hyundai
2664
2928
  # @ref: http://www.hyundaitechnologies.com
2665
2929
  #########
2666
- - regex: '; *HYUNDAI (T\d[^/]*) Build'
2930
+ - regex: '; {0,2}HYUNDAI (T\d[^/]{0,10})(?: Build|\) AppleWebKit)'
2667
2931
  device_replacement: 'Hyundai $1'
2668
2932
  brand_replacement: 'Hyundai'
2669
2933
  model_replacement: '$1'
2670
- - regex: '; *HYUNDAI ([^;/]+) Build'
2934
+ - regex: '; {0,2}HYUNDAI ([^;/]{1,10}?)(?: Build|\) AppleWebKit)'
2671
2935
  device_replacement: 'Hyundai $1'
2672
2936
  brand_replacement: 'Hyundai'
2673
2937
  model_replacement: '$1'
2674
2938
  # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
2675
- - regex: '; *(X700|Hold X|MB-6900) Build'
2939
+ - regex: '; {0,2}(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2676
2940
  device_replacement: 'Hyundai $1'
2677
2941
  brand_replacement: 'Hyundai'
2678
2942
  model_replacement: '$1'
@@ -2681,12 +2945,12 @@ device_parsers:
2681
2945
  # iBall
2682
2946
  # @ref: http://www.iball.co.in/Category/Mobiles/22
2683
2947
  #########
2684
- - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*) Build'
2948
+ - regex: '; {0,2}(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2685
2949
  regex_flag: 'i'
2686
2950
  device_replacement: '$1 $2'
2687
2951
  brand_replacement: 'iBall'
2688
2952
  model_replacement: '$1 $2'
2689
- - regex: '; *(IBall)(?:[ _]([^;/]+)|) Build'
2953
+ - regex: '; {0,2}(IBall)(?:[ _]([^;/]{1,100}?)|)(?: Build|\) AppleWebKit)'
2690
2954
  regex_flag: 'i'
2691
2955
  device_replacement: '$1 $2'
2692
2956
  brand_replacement: 'iBall'
@@ -2696,7 +2960,7 @@ device_parsers:
2696
2960
  # IconBIT
2697
2961
  # @ref: http://www.iconbit.com/catalog/tablets/
2698
2962
  #########
2699
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|) Build'
2963
+ - regex: '; {0,2}(NT-\d+[^ ;/]{0,50}|Net[Tt]AB [^;/]{1,50}|Mercury [A-Z]{1,50}|iconBIT)(?: S/N:[^;/]{1,50}|)(?: Build|\) AppleWebKit)'
2700
2964
  device_replacement: '$1'
2701
2965
  brand_replacement: 'IconBIT'
2702
2966
  model_replacement: '$1'
@@ -2705,7 +2969,7 @@ device_parsers:
2705
2969
  # IMO
2706
2970
  # @ref: http://www.ponselimo.com/
2707
2971
  #########
2708
- - regex: '; *(IMO)[ _]([^;/]+) Build'
2972
+ - regex: '; {0,2}(IMO)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2709
2973
  regex_flag: 'i'
2710
2974
  device_replacement: '$1 $2'
2711
2975
  brand_replacement: 'IMO'
@@ -2715,12 +2979,12 @@ device_parsers:
2715
2979
  # i-mobile
2716
2980
  # @ref: http://www.i-mobilephone.com/
2717
2981
  #########
2718
- - regex: '; *i-?mobile[ _]([^/]+) Build/'
2982
+ - regex: '; {0,2}i-?mobile[ _]([^/]{1,50})(?: Build|\) AppleWebKit)'
2719
2983
  regex_flag: 'i'
2720
2984
  device_replacement: 'i-mobile $1'
2721
2985
  brand_replacement: 'imobile'
2722
2986
  model_replacement: '$1'
2723
- - regex: '; *(i-(?:style|note)[^/]*) Build/'
2987
+ - regex: '; {0,2}(i-(?:style|note)[^/]{0,10})(?: Build|\) AppleWebKit)'
2724
2988
  regex_flag: 'i'
2725
2989
  device_replacement: 'i-mobile $1'
2726
2990
  brand_replacement: 'imobile'
@@ -2730,7 +2994,7 @@ device_parsers:
2730
2994
  # Impression
2731
2995
  # @ref: http://impression.ua/planshetnye-kompyutery
2732
2996
  #########
2733
- - regex: '; *(ImPAD) ?(\d+(?:.)*) Build'
2997
+ - regex: '; {0,2}(ImPAD) ?(\d+(?:.){0,100}?)(?: Build|\) AppleWebKit)'
2734
2998
  device_replacement: '$1 $2'
2735
2999
  brand_replacement: 'Impression'
2736
3000
  model_replacement: '$1 $2'
@@ -2739,7 +3003,7 @@ device_parsers:
2739
3003
  # Infinix
2740
3004
  # @ref: http://www.infinixmobility.com/index.html
2741
3005
  #########
2742
- - regex: '; *(Infinix)[ _]([^;/]+) Build'
3006
+ - regex: '; {0,2}(Infinix)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2743
3007
  device_replacement: '$1 $2'
2744
3008
  brand_replacement: 'Infinix'
2745
3009
  model_replacement: '$2'
@@ -2748,7 +3012,7 @@ device_parsers:
2748
3012
  # Informer
2749
3013
  # @ref: ??
2750
3014
  #########
2751
- - regex: '; *(Informer)[ \-]([^;/]+) Build'
3015
+ - regex: '; {0,2}(Informer)[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2752
3016
  device_replacement: '$1 $2'
2753
3017
  brand_replacement: 'Informer'
2754
3018
  model_replacement: '$2'
@@ -2758,7 +3022,7 @@ device_parsers:
2758
3022
  # @ref: http://www.intenso.de
2759
3023
  # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
2760
3024
  #########
2761
- - regex: '; *(TAB) ?([78][12]4) Build'
3025
+ - regex: '; {0,2}(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
2762
3026
  device_replacement: 'Intenso $1'
2763
3027
  brand_replacement: 'Intenso'
2764
3028
  model_replacement: '$1 $2'
@@ -2769,21 +3033,21 @@ device_parsers:
2769
3033
  # @note: Zync also offers a "Cloud Z5" device
2770
3034
  #########
2771
3035
  # smartphones
2772
- - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)'
3036
+ - regex: '; {0,2}(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]{1,100}?) {0,2}(?:Build|;)'
2773
3037
  device_replacement: '$1$2$3'
2774
3038
  brand_replacement: 'Intex'
2775
3039
  model_replacement: '$1 $3'
2776
3040
  # matches "INTEX CLOUD X1"
2777
- - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
3041
+ - regex: '; {0,2}(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) {0,2}(?:Build|;)'
2778
3042
  device_replacement: '$1 $2'
2779
3043
  brand_replacement: 'Intex'
2780
3044
  model_replacement: '$1 $2'
2781
3045
  # tablets
2782
- - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
3046
+ - regex: '; {0,2}([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]{0,50}) {0,2}(?:Build|;)'
2783
3047
  device_replacement: '$1 $2 $3'
2784
3048
  brand_replacement: 'Intex'
2785
3049
  model_replacement: 'iBuddy $2 $3'
2786
- - regex: '; *(I-Buddy)[ _]([^;/]+) *(?:Build|;)'
3050
+ - regex: '; {0,2}(I-Buddy)[ _]([^;/]{1,100}?) {0,2}(?:Build|;)'
2787
3051
  device_replacement: '$1 $2'
2788
3052
  brand_replacement: 'Intex'
2789
3053
  model_replacement: 'iBuddy $2'
@@ -2792,7 +3056,7 @@ device_parsers:
2792
3056
  # iOCEAN
2793
3057
  # @ref: http://www.iocean.cc/
2794
3058
  #########
2795
- - regex: '; *(iOCEAN) ([^/]+) Build'
3059
+ - regex: '; {0,2}(iOCEAN) ([^/]{1,50})(?: Build|\) AppleWebKit)'
2796
3060
  regex_flag: 'i'
2797
3061
  device_replacement: '$1 $2'
2798
3062
  brand_replacement: 'iOCEAN'
@@ -2802,7 +3066,7 @@ device_parsers:
2802
3066
  # i.onik
2803
3067
  # @ref: http://www.i-onik.de/
2804
3068
  #########
2805
- - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+) Build'
3069
+ - regex: '; {0,2}(TP\d+(?:\.\d+|)\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2806
3070
  device_replacement: 'ionik $1'
2807
3071
  brand_replacement: 'ionik'
2808
3072
  model_replacement: '$1'
@@ -2811,21 +3075,30 @@ device_parsers:
2811
3075
  # IRU.ru
2812
3076
  # @ref: http://www.iru.ru/catalog/soho/planetable/
2813
3077
  #########
2814
- - regex: '; *(M702pro) Build'
3078
+ - regex: '; {0,2}(M702pro)(?: Build|\) AppleWebKit)'
2815
3079
  device_replacement: '$1'
2816
3080
  brand_replacement: 'Iru'
2817
3081
  model_replacement: '$1'
2818
3082
 
3083
+ #########
3084
+ # Itel Mobile
3085
+ # @ref: https://www.itel-mobile.com/global/products/
3086
+ #########
3087
+ - regex: '; {0,2}itel ([^;/]*)(?: Build|\) AppleWebKit)'
3088
+ device_replacement: 'Itel $1'
3089
+ brand_replacement: 'Itel'
3090
+ model_replacement: '$1'
3091
+
2819
3092
  #########
2820
3093
  # Ivio
2821
3094
  # @ref: http://www.ivio.com/mobile.php
2822
3095
  # @models: DG80,DG20,DE38,DE88,MD70
2823
3096
  #########
2824
- - regex: '; *(DE88Plus|MD70) Build'
3097
+ - regex: '; {0,2}(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
2825
3098
  device_replacement: '$1'
2826
3099
  brand_replacement: 'Ivio'
2827
3100
  model_replacement: '$1'
2828
- - regex: '; *IVIO[_\-]([^;/]+) Build'
3101
+ - regex: '; {0,2}IVIO[_\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2829
3102
  device_replacement: '$1'
2830
3103
  brand_replacement: 'Ivio'
2831
3104
  model_replacement: '$1'
@@ -2834,7 +3107,7 @@ device_parsers:
2834
3107
  # Jaytech
2835
3108
  # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
2836
3109
  #########
2837
- - regex: '; *(TPC-\d+|JAY-TECH) Build'
3110
+ - regex: '; {0,2}(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
2838
3111
  device_replacement: '$1'
2839
3112
  brand_replacement: 'Jaytech'
2840
3113
  model_replacement: '$1'
@@ -2843,7 +3116,7 @@ device_parsers:
2843
3116
  # Jiayu
2844
3117
  # @ref: http://www.ejiayu.com/en/Product.html
2845
3118
  #########
2846
- - regex: '; *(JY-[^;/]+|G[234]S?) Build'
3119
+ - regex: '; {0,2}(JY-[^;/]{1,100}|G[234]S?)(?: Build|\) AppleWebKit)'
2847
3120
  device_replacement: '$1'
2848
3121
  brand_replacement: 'Jiayu'
2849
3122
  model_replacement: '$1'
@@ -2852,7 +3125,7 @@ device_parsers:
2852
3125
  # JXD
2853
3126
  # @ref: http://www.jxd.hk/
2854
3127
  #########
2855
- - regex: '; *(JXD)[ _\-]([^;/]+) Build'
3128
+ - regex: '; {0,2}(JXD)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2856
3129
  device_replacement: '$1 $2'
2857
3130
  brand_replacement: 'JXD'
2858
3131
  model_replacement: '$2'
@@ -2861,16 +3134,16 @@ device_parsers:
2861
3134
  # Karbonn
2862
3135
  # @ref: http://www.karbonnmobiles.com/products_tablet.php
2863
3136
  #########
2864
- - regex: '; *Karbonn[ _]?([^;/]+) *(?:Build|;)'
3137
+ - regex: '; {0,2}Karbonn[ _]?([^;/]{1,100}) {0,2}(?:Build|;)'
2865
3138
  regex_flag: 'i'
2866
3139
  device_replacement: '$1'
2867
3140
  brand_replacement: 'Karbonn'
2868
3141
  model_replacement: '$1'
2869
- - regex: '; *([^;]+) Build/Karbonn'
3142
+ - regex: '; {0,2}([^;]{1,200}) Build/Karbonn'
2870
3143
  device_replacement: '$1'
2871
3144
  brand_replacement: 'Karbonn'
2872
3145
  model_replacement: '$1'
2873
- - regex: '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
3146
+ - regex: '; {0,2}(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
2874
3147
  device_replacement: '$1'
2875
3148
  brand_replacement: 'Karbonn'
2876
3149
  model_replacement: '$1'
@@ -2879,84 +3152,84 @@ device_parsers:
2879
3152
  # KDDI (Operator Branded Device)
2880
3153
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2881
3154
  #########
2882
- - regex: '; *(IS01|IS03|IS05|IS\d{2}SH) Build'
3155
+ - regex: '; {0,2}(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
2883
3156
  device_replacement: '$1'
2884
3157
  brand_replacement: 'Sharp'
2885
3158
  model_replacement: '$1'
2886
- - regex: '; *(IS04) Build'
3159
+ - regex: '; {0,2}(IS04)(?: Build|\) AppleWebKit)'
2887
3160
  device_replacement: '$1'
2888
3161
  brand_replacement: 'Regza'
2889
3162
  model_replacement: '$1'
2890
- - regex: '; *(IS06|IS\d{2}PT) Build'
3163
+ - regex: '; {0,2}(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
2891
3164
  device_replacement: '$1'
2892
3165
  brand_replacement: 'Pantech'
2893
3166
  model_replacement: '$1'
2894
- - regex: '; *(IS11S) Build'
3167
+ - regex: '; {0,2}(IS11S)(?: Build|\) AppleWebKit)'
2895
3168
  device_replacement: '$1'
2896
3169
  brand_replacement: 'SonyEricsson'
2897
3170
  model_replacement: 'Xperia Acro'
2898
- - regex: '; *(IS11CA) Build'
3171
+ - regex: '; {0,2}(IS11CA)(?: Build|\) AppleWebKit)'
2899
3172
  device_replacement: '$1'
2900
3173
  brand_replacement: 'Casio'
2901
3174
  model_replacement: 'GzOne $1'
2902
- - regex: '; *(IS11LG) Build'
3175
+ - regex: '; {0,2}(IS11LG)(?: Build|\) AppleWebKit)'
2903
3176
  device_replacement: '$1'
2904
3177
  brand_replacement: 'LG'
2905
3178
  model_replacement: 'Optimus X'
2906
- - regex: '; *(IS11N) Build'
3179
+ - regex: '; {0,2}(IS11N)(?: Build|\) AppleWebKit)'
2907
3180
  device_replacement: '$1'
2908
3181
  brand_replacement: 'Medias'
2909
3182
  model_replacement: '$1'
2910
- - regex: '; *(IS11PT) Build'
3183
+ - regex: '; {0,2}(IS11PT)(?: Build|\) AppleWebKit)'
2911
3184
  device_replacement: '$1'
2912
3185
  brand_replacement: 'Pantech'
2913
3186
  model_replacement: 'MIRACH'
2914
- - regex: '; *(IS12F) Build'
3187
+ - regex: '; {0,2}(IS12F)(?: Build|\) AppleWebKit)'
2915
3188
  device_replacement: '$1'
2916
3189
  brand_replacement: 'Fujitsu'
2917
3190
  model_replacement: 'Arrows ES'
2918
3191
  # @ref: https://ja.wikipedia.org/wiki/IS12M
2919
- - regex: '; *(IS12M) Build'
3192
+ - regex: '; {0,2}(IS12M)(?: Build|\) AppleWebKit)'
2920
3193
  device_replacement: '$1'
2921
3194
  brand_replacement: 'Motorola'
2922
3195
  model_replacement: 'XT909'
2923
- - regex: '; *(IS12S) Build'
3196
+ - regex: '; {0,2}(IS12S)(?: Build|\) AppleWebKit)'
2924
3197
  device_replacement: '$1'
2925
3198
  brand_replacement: 'SonyEricsson'
2926
3199
  model_replacement: 'Xperia Acro HD'
2927
- - regex: '; *(ISW11F) Build'
3200
+ - regex: '; {0,2}(ISW11F)(?: Build|\) AppleWebKit)'
2928
3201
  device_replacement: '$1'
2929
3202
  brand_replacement: 'Fujitsu'
2930
3203
  model_replacement: 'Arrowz Z'
2931
- - regex: '; *(ISW11HT) Build'
3204
+ - regex: '; {0,2}(ISW11HT)(?: Build|\) AppleWebKit)'
2932
3205
  device_replacement: '$1'
2933
3206
  brand_replacement: 'HTC'
2934
3207
  model_replacement: 'EVO'
2935
- - regex: '; *(ISW11K) Build'
3208
+ - regex: '; {0,2}(ISW11K)(?: Build|\) AppleWebKit)'
2936
3209
  device_replacement: '$1'
2937
3210
  brand_replacement: 'Kyocera'
2938
3211
  model_replacement: 'DIGNO'
2939
- - regex: '; *(ISW11M) Build'
3212
+ - regex: '; {0,2}(ISW11M)(?: Build|\) AppleWebKit)'
2940
3213
  device_replacement: '$1'
2941
3214
  brand_replacement: 'Motorola'
2942
3215
  model_replacement: 'Photon'
2943
- - regex: '; *(ISW11SC) Build'
3216
+ - regex: '; {0,2}(ISW11SC)(?: Build|\) AppleWebKit)'
2944
3217
  device_replacement: '$1'
2945
3218
  brand_replacement: 'Samsung'
2946
3219
  model_replacement: 'GALAXY S II WiMAX'
2947
- - regex: '; *(ISW12HT) Build'
3220
+ - regex: '; {0,2}(ISW12HT)(?: Build|\) AppleWebKit)'
2948
3221
  device_replacement: '$1'
2949
3222
  brand_replacement: 'HTC'
2950
3223
  model_replacement: 'EVO 3D'
2951
- - regex: '; *(ISW13HT) Build'
3224
+ - regex: '; {0,2}(ISW13HT)(?: Build|\) AppleWebKit)'
2952
3225
  device_replacement: '$1'
2953
3226
  brand_replacement: 'HTC'
2954
3227
  model_replacement: 'J'
2955
- - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2}) Build'
3228
+ - regex: '; {0,2}(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
2956
3229
  device_replacement: '$1'
2957
3230
  brand_replacement: 'KDDI'
2958
3231
  model_replacement: '$1'
2959
- - regex: '; *(INFOBAR [^;/]+) Build'
3232
+ - regex: '; {0,2}(INFOBAR [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2960
3233
  device_replacement: '$1'
2961
3234
  brand_replacement: 'KDDI'
2962
3235
  model_replacement: '$1'
@@ -2965,7 +3238,7 @@ device_parsers:
2965
3238
  # Kingcom
2966
3239
  # @ref: http://www.e-kingcom.com
2967
3240
  #########
2968
- - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+) Build/'
3241
+ - regex: '; {0,2}(JOYPAD|Joypad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2969
3242
  device_replacement: '$1 $2'
2970
3243
  brand_replacement: 'Kingcom'
2971
3244
  model_replacement: '$1 $2'
@@ -2975,7 +3248,7 @@ device_parsers:
2975
3248
  # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
2976
3249
  # @ref: http://www.kobo.com/devices#tablets
2977
3250
  #########
2978
- - regex: '; *(Vox|VOX|Arc|K080) Build/'
3251
+ - regex: '; {0,2}(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
2979
3252
  regex_flag: 'i'
2980
3253
  device_replacement: '$1'
2981
3254
  brand_replacement: 'Kobo'
@@ -2989,7 +3262,7 @@ device_parsers:
2989
3262
  # K-Touch
2990
3263
  # @ref: ??
2991
3264
  #########
2992
- - regex: '; *(K-Touch)[ _]([^;/]+) Build'
3265
+ - regex: '; {0,2}(K-Touch)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2993
3266
  regex_flag: 'i'
2994
3267
  device_replacement: '$1 $2'
2995
3268
  brand_replacement: 'Ktouch'
@@ -2999,7 +3272,7 @@ device_parsers:
2999
3272
  # KT Tech
3000
3273
  # @ref: http://www.kttech.co.kr
3001
3274
  #########
3002
- - regex: '; *((?:EV|KM)-S\d+[A-Z]?) Build'
3275
+ - regex: '; {0,2}((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3003
3276
  regex_flag: 'i'
3004
3277
  device_replacement: '$1'
3005
3278
  brand_replacement: 'KTtech'
@@ -3009,7 +3282,7 @@ device_parsers:
3009
3282
  # Kyocera
3010
3283
  # @ref: http://www.android.com/devices/?country=all&m=kyocera
3011
3284
  #########
3012
- - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2}) Build/'
3285
+ - regex: '; {0,2}(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3013
3286
  device_replacement: '$1'
3014
3287
  brand_replacement: 'Kyocera'
3015
3288
  model_replacement: '$1'
@@ -3018,12 +3291,12 @@ device_parsers:
3018
3291
  # Lava
3019
3292
  # @ref: http://www.lavamobiles.com/
3020
3293
  #########
3021
- - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
3294
+ - regex: '; {0,2}(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
3022
3295
  regex_flag: 'i'
3023
3296
  device_replacement: 'Iris $1'
3024
3297
  brand_replacement: 'Lava'
3025
3298
  model_replacement: 'Iris $1'
3026
- - regex: '; *LAVA[ _]([^;/]+) Build'
3299
+ - regex: '; {0,2}LAVA[ _]([^;/]{1,100}) Build'
3027
3300
  device_replacement: '$1'
3028
3301
  brand_replacement: 'Lava'
3029
3302
  model_replacement: '$1'
@@ -3032,7 +3305,7 @@ device_parsers:
3032
3305
  # Lemon
3033
3306
  # @ref: http://www.lemonmobiles.com/products.php?type=1
3034
3307
  #########
3035
- - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_? Build'
3308
+ - regex: '; {0,2}(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]{1,100}))_?(?: Build|\) AppleWebKit)'
3036
3309
  device_replacement: 'Lemon $1$2'
3037
3310
  brand_replacement: 'Lemon'
3038
3311
  model_replacement: '$1$2'
@@ -3041,11 +3314,11 @@ device_parsers:
3041
3314
  # Lenco
3042
3315
  # @ref: http://www.lenco.com/c/tablets/
3043
3316
  #########
3044
- - regex: '; *(TAB-1012) Build/'
3317
+ - regex: '; {0,2}(TAB-1012)(?: Build|\) AppleWebKit)'
3045
3318
  device_replacement: 'Lenco $1'
3046
3319
  brand_replacement: 'Lenco'
3047
3320
  model_replacement: '$1'
3048
- - regex: '; Lenco ([^;/]+) Build/'
3321
+ - regex: '; Lenco ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3049
3322
  device_replacement: 'Lenco $1'
3050
3323
  brand_replacement: 'Lenco'
3051
3324
  model_replacement: '$1'
@@ -3054,23 +3327,23 @@ device_parsers:
3054
3327
  # Lenovo
3055
3328
  # @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
3056
3329
  #########
3057
- - regex: '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3330
+ - regex: '; {0,2}(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3058
3331
  device_replacement: '$1'
3059
3332
  brand_replacement: 'Lenovo'
3060
3333
  model_replacement: '$1'
3061
- - regex: '; *(Idea[Tp]ab)[ _]([^;/]+);? Build'
3334
+ - regex: '; {0,2}(Idea[Tp]ab)[ _]([^;/]{1,100});? Build'
3062
3335
  device_replacement: 'Lenovo $1 $2'
3063
3336
  brand_replacement: 'Lenovo'
3064
3337
  model_replacement: '$1 $2'
3065
- - regex: '; *(Idea(?:Tab|pad)) ?([^;/]+) Build'
3338
+ - regex: '; {0,2}(Idea(?:Tab|pad)) ?([^;/]{1,100}) Build'
3066
3339
  device_replacement: 'Lenovo $1 $2'
3067
3340
  brand_replacement: 'Lenovo'
3068
3341
  model_replacement: '$1 $2'
3069
- - regex: '; *(ThinkPad) ?(Tablet) Build/'
3342
+ - regex: '; {0,2}(ThinkPad) ?(Tablet) Build/'
3070
3343
  device_replacement: 'Lenovo $1 $2'
3071
3344
  brand_replacement: 'Lenovo'
3072
3345
  model_replacement: '$1 $2'
3073
- - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
3346
+ - regex: '; {0,2}(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.{1,200}?)(?:Build|[;/\)])'
3074
3347
  device_replacement: 'Lenovo $1'
3075
3348
  brand_replacement: 'Lenovo'
3076
3349
  model_replacement: '$1'
@@ -3078,11 +3351,11 @@ device_parsers:
3078
3351
  device_replacement: 'Lenovo $1 $2 $3'
3079
3352
  brand_replacement: 'Lenovo'
3080
3353
  model_replacement: '$1 $2 $3'
3081
- - regex: '; *(?:Ideapad |)K1 Build/'
3354
+ - regex: '; {0,2}(?:Ideapad |)K1 Build/'
3082
3355
  device_replacement: 'Lenovo Ideapad K1'
3083
3356
  brand_replacement: 'Lenovo'
3084
3357
  model_replacement: 'Ideapad K1'
3085
- - regex: '; *(3GC101|3GW10[01]|A390) Build/'
3358
+ - regex: '; {0,2}(3GC101|3GW10[01]|A390) Build/'
3086
3359
  device_replacement: '$1'
3087
3360
  brand_replacement: 'Lenovo'
3088
3361
  model_replacement: '$1'
@@ -3095,7 +3368,7 @@ device_parsers:
3095
3368
  # Lexibook
3096
3369
  # @ref: http://www.lexibook.com/fr
3097
3370
  #########
3098
- - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),? Build'
3371
+ - regex: '; {0,2}(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3099
3372
  device_replacement: '$1$2'
3100
3373
  brand_replacement: 'Lexibook'
3101
3374
  model_replacement: '$1$2'
@@ -3104,23 +3377,23 @@ device_parsers:
3104
3377
  # LG
3105
3378
  # @ref: http://www.lg.com/uk/mobile
3106
3379
  #########
3107
- - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)'
3380
+ - regex: '; {0,2}(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]{1,30}|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) {0,2}(?:Build|;)'
3108
3381
  device_replacement: '$1'
3109
3382
  brand_replacement: 'LG'
3110
3383
  model_replacement: '$1'
3111
- - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
3384
+ - regex: '[;:] {0,2}(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) {0,2}(?:Build|[;\)])'
3112
3385
  device_replacement: '$1'
3113
3386
  brand_replacement: 'LG'
3114
3387
  model_replacement: '$1'
3115
- - regex: '; *(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3388
+ - regex: '; {0,2}(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3116
3389
  device_replacement: '$1$2'
3117
3390
  brand_replacement: 'LG'
3118
3391
  model_replacement: '$2'
3119
- - regex: '; *(LG[ \-]|LG)([^;/]+)[;/]? Build'
3392
+ - regex: '; {0,2}(LG[ \-]|LG)([^;/]{1,100})[;/]? Build'
3120
3393
  device_replacement: '$1$2'
3121
3394
  brand_replacement: 'LG'
3122
3395
  model_replacement: '$2'
3123
- - regex: '^(LG)-([^;/]+)/ Mozilla/.*; Android'
3396
+ - regex: '^(LG)-([^;/]{1,100})/ Mozilla/.{0,200}; Android'
3124
3397
  device_replacement: '$1 $2'
3125
3398
  brand_replacement: 'LG'
3126
3399
  model_replacement: '$2'
@@ -3133,11 +3406,11 @@ device_parsers:
3133
3406
  # Malata
3134
3407
  # @ref: http://www.malata.com/en/products.aspx?classid=680
3135
3408
  #########
3136
- - regex: '; *((?:SMB|smb)[^;/]+) Build/'
3409
+ - regex: '; {0,2}((?:SMB|smb)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3137
3410
  device_replacement: '$1'
3138
3411
  brand_replacement: 'Malata'
3139
3412
  model_replacement: '$1'
3140
- - regex: '; *(?:Malata|MALATA) ([^;/]+) Build/'
3413
+ - regex: '; {0,2}(?:Malata|MALATA) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3141
3414
  device_replacement: '$1'
3142
3415
  brand_replacement: 'Malata'
3143
3416
  model_replacement: '$1'
@@ -3146,7 +3419,7 @@ device_parsers:
3146
3419
  # Manta
3147
3420
  # @ref: http://www.manta.com.pl/en
3148
3421
  #########
3149
- - regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9]) Build/'
3422
+ - regex: '; {0,2}(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
3150
3423
  device_replacement: '$1'
3151
3424
  brand_replacement: 'Manta'
3152
3425
  model_replacement: '$1'
@@ -3155,7 +3428,7 @@ device_parsers:
3155
3428
  # Match
3156
3429
  # @ref: http://www.match.net.cn/products.asp
3157
3430
  #########
3158
- - 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/'
3431
+ - regex: '; {0,2}(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\) AppleWebKit)'
3159
3432
  device_replacement: '$1'
3160
3433
  brand_replacement: 'Match'
3161
3434
  model_replacement: '$1'
@@ -3169,7 +3442,7 @@ device_parsers:
3169
3442
  # Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
3170
3443
  # @note: Need more User-Agents!!!
3171
3444
  #########
3172
- - regex: '; *(GenxDroid7|MSD7.*|AX\d.*|Tab 701|Tab 722) Build/'
3445
+ - regex: '; {0,2}(GenxDroid7|MSD7.{0,200}?|AX\d.{0,200}?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3173
3446
  device_replacement: 'Maxx $1'
3174
3447
  brand_replacement: 'Maxx'
3175
3448
  model_replacement: '$1'
@@ -3178,11 +3451,11 @@ device_parsers:
3178
3451
  # Mediacom
3179
3452
  # @ref: http://www.mediacomeurope.it/
3180
3453
  #########
3181
- - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+) Build'
3454
+ - regex: '; {0,2}(M-PP[^;/]{1,30}|PhonePad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3182
3455
  device_replacement: 'Mediacom $1'
3183
3456
  brand_replacement: 'Mediacom'
3184
3457
  model_replacement: '$1'
3185
- - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+) Build'
3458
+ - regex: '; {0,2}(M-MP[^;/]{1,30}|SmartPad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3186
3459
  device_replacement: 'Mediacom $1'
3187
3460
  brand_replacement: 'Mediacom'
3188
3461
  model_replacement: '$1'
@@ -3191,12 +3464,12 @@ device_parsers:
3191
3464
  # Medion
3192
3465
  # @ref: http://www.medion.com/en/
3193
3466
  #########
3194
- - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+) Build'
3467
+ - regex: '; {0,2}(?:MD_|)LIFETAB[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3195
3468
  regex_flag: 'i'
3196
3469
  device_replacement: 'Medion Lifetab $1'
3197
3470
  brand_replacement: 'Medion'
3198
3471
  model_replacement: 'Lifetab $1'
3199
- - regex: '; *MEDION ([^;/]+) Build'
3472
+ - regex: '; {0,2}MEDION ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3200
3473
  device_replacement: 'Medion $1'
3201
3474
  brand_replacement: 'Medion'
3202
3475
  model_replacement: '$1'
@@ -3205,11 +3478,11 @@ device_parsers:
3205
3478
  # Meizu
3206
3479
  # @ref: http://www.meizu.com
3207
3480
  #########
3208
- - regex: '; *(M030|M031|M035|M040|M065|m9) Build'
3481
+ - regex: '; {0,2}(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3209
3482
  device_replacement: 'Meizu $1'
3210
3483
  brand_replacement: 'Meizu'
3211
3484
  model_replacement: '$1'
3212
- - regex: '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\)])'
3485
+ - regex: '; {0,2}(?:meizu_|MEIZU )(.{1,200}?) {0,2}(?:Build|[;\)])'
3213
3486
  device_replacement: 'Meizu $1'
3214
3487
  brand_replacement: 'Meizu'
3215
3488
  model_replacement: '$1'
@@ -3218,28 +3491,28 @@ device_parsers:
3218
3491
  # Micromax
3219
3492
  # @ref: http://www.micromaxinfo.com
3220
3493
  #########
3221
- - regex: '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3494
+ - regex: '; {0,2}(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3222
3495
  regex_flag: 'i'
3223
3496
  device_replacement: 'Micromax $1$2'
3224
3497
  brand_replacement: 'Micromax'
3225
3498
  model_replacement: '$1$2'
3226
- - regex: '; *Micromax[ _](A\d{2,3}[^;/]*) Build'
3499
+ - regex: '; {0,2}Micromax[ _](A\d{2,3}[^;/]*) Build'
3227
3500
  regex_flag: 'i'
3228
3501
  device_replacement: 'Micromax $1'
3229
3502
  brand_replacement: 'Micromax'
3230
3503
  model_replacement: '$1'
3231
3504
  # be carefull here with Acer e.g. A500
3232
- - regex: '; *(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3505
+ - regex: '; {0,2}(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3233
3506
  regex_flag: 'i'
3234
3507
  device_replacement: 'Micromax $1'
3235
3508
  brand_replacement: 'Micromax'
3236
3509
  model_replacement: '$1'
3237
- - regex: '; *Micromax[ _](P\d{3}[^;/]*) Build'
3510
+ - regex: '; {0,2}Micromax[ _](P\d{3}[^;/]*) Build'
3238
3511
  regex_flag: 'i'
3239
3512
  device_replacement: 'Micromax $1'
3240
3513
  brand_replacement: 'Micromax'
3241
3514
  model_replacement: '$1'
3242
- - regex: '; *(P\d{3}|P\d{3}\(Funbook\)) Build'
3515
+ - regex: '; {0,2}(P\d{3}|P\d{3}\(Funbook\)) Build'
3243
3516
  regex_flag: 'i'
3244
3517
  device_replacement: 'Micromax $1'
3245
3518
  brand_replacement: 'Micromax'
@@ -3249,7 +3522,7 @@ device_parsers:
3249
3522
  # Mito
3250
3523
  # @ref: http://new.mitomobile.com/
3251
3524
  #########
3252
- - regex: '; *(MITO)[ _\-]?([^;/]+) Build'
3525
+ - regex: '; {0,2}(MITO)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3253
3526
  regex_flag: 'i'
3254
3527
  device_replacement: '$1 $2'
3255
3528
  brand_replacement: 'Mito'
@@ -3259,7 +3532,7 @@ device_parsers:
3259
3532
  # Mobistel
3260
3533
  # @ref: http://www.mobistel.com/
3261
3534
  #########
3262
- - regex: '; *(Cynus)[ _](F5|T\d|.+?) *(?:Build|[;/\)])'
3535
+ - regex: '; {0,2}(Cynus)[ _](F5|T\d|.{1,200}?) {0,2}(?:Build|[;/\)])'
3263
3536
  regex_flag: 'i'
3264
3537
  device_replacement: '$1 $2'
3265
3538
  brand_replacement: 'Mobistel'
@@ -3269,12 +3542,12 @@ device_parsers:
3269
3542
  # Modecom
3270
3543
  # @ref: http://www.modecom.eu/tablets/portal/
3271
3544
  #########
3272
- - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+) Build'
3545
+ - regex: '; {0,2}(MODECOM |)(FreeTab) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3273
3546
  regex_flag: 'i'
3274
3547
  device_replacement: '$1$2 $3'
3275
3548
  brand_replacement: 'Modecom'
3276
3549
  model_replacement: '$2 $3'
3277
- - regex: '; *(MODECOM )([^;/]+) Build'
3550
+ - regex: '; {0,2}(MODECOM )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3278
3551
  regex_flag: 'i'
3279
3552
  device_replacement: '$1 $2'
3280
3553
  brand_replacement: 'Modecom'
@@ -3284,32 +3557,32 @@ device_parsers:
3284
3557
  # Motorola
3285
3558
  # @ref: http://www.motorola.com/us/shop-all-mobile-phones/
3286
3559
  #########
3287
- - regex: '; *(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3560
+ - regex: '; {0,2}(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3288
3561
  device_replacement: 'Motorola $1'
3289
3562
  brand_replacement: 'Motorola'
3290
3563
  model_replacement: '$1'
3291
- - regex: '; *(Milestone )(XT[^;/]*) Build'
3564
+ - regex: '; {0,2}(Milestone )(XT[^;/]*) Build'
3292
3565
  device_replacement: 'Motorola $1$2'
3293
3566
  brand_replacement: 'Motorola'
3294
3567
  model_replacement: '$2'
3295
- - regex: '; *(Motoroi ?x|Droid X|DROIDX) Build'
3568
+ - regex: '; {0,2}(Motoroi ?x|Droid X|DROIDX) Build'
3296
3569
  regex_flag: 'i'
3297
3570
  device_replacement: 'Motorola $1'
3298
3571
  brand_replacement: 'Motorola'
3299
3572
  model_replacement: 'DROID X'
3300
- - regex: '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3573
+ - regex: '; {0,2}(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3301
3574
  device_replacement: 'Motorola $1'
3302
3575
  brand_replacement: 'Motorola'
3303
3576
  model_replacement: '$1'
3304
- - regex: '; *(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
3577
+ - regex: '; {0,2}(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
3305
3578
  device_replacement: '$1'
3306
3579
  brand_replacement: 'Motorola'
3307
3580
  model_replacement: '$1'
3308
- - regex: '; *(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]+) Build'
3581
+ - regex: '; {0,2}(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]{1,100}) Build'
3309
3582
  device_replacement: '$1$2'
3310
3583
  brand_replacement: 'Motorola'
3311
3584
  model_replacement: '$2'
3312
- - regex: '; *(Moto[_ ]?|MOT\-)([^;/]+) Build'
3585
+ - regex: '; {0,2}(Moto[_ ]?|MOT\-)([^;/]{1,100}) Build'
3313
3586
  device_replacement: '$1$2'
3314
3587
  brand_replacement: 'Motorola'
3315
3588
  model_replacement: '$2'
@@ -3318,7 +3591,7 @@ device_parsers:
3318
3591
  # MpMan
3319
3592
  # @ref: http://www.mpmaneurope.com
3320
3593
  #########
3321
- - 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'
3594
+ - regex: '; {0,2}((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\) AppleWebKit)'
3322
3595
  device_replacement: '$1'
3323
3596
  brand_replacement: 'Mpman'
3324
3597
  model_replacement: '$1'
@@ -3327,7 +3600,7 @@ device_parsers:
3327
3600
  # MSI
3328
3601
  # @ref: http://www.msi.com/product/windpad/
3329
3602
  #########
3330
- - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+) Build'
3603
+ - regex: '; {0,2}(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3331
3604
  regex_flag: 'i'
3332
3605
  device_replacement: '$1'
3333
3606
  brand_replacement: 'Msi'
@@ -3337,7 +3610,7 @@ device_parsers:
3337
3610
  # Multilaser
3338
3611
  # http://www.multilaser.com.br/listagem_produtos.php?cat=5
3339
3612
  #########
3340
- - regex: '; *Multilaser[ _]([^;/]+) Build'
3613
+ - regex: '; {0,2}Multilaser[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3341
3614
  device_replacement: '$1'
3342
3615
  brand_replacement: 'Multilaser'
3343
3616
  model_replacement: '$1'
@@ -3346,15 +3619,15 @@ device_parsers:
3346
3619
  # MyPhone
3347
3620
  # @ref: http://myphone.com.ph/
3348
3621
  #########
3349
- - regex: '; *(My)[_]?(Pad)[ _]([^;/]+) Build'
3622
+ - regex: '; {0,2}(My)[_]?(Pad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3350
3623
  device_replacement: '$1$2 $3'
3351
3624
  brand_replacement: 'MyPhone'
3352
3625
  model_replacement: '$1$2 $3'
3353
- - regex: '; *(My)\|?(Phone)[ _]([^;/]+) Build'
3626
+ - regex: '; {0,2}(My)\|?(Phone)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3354
3627
  device_replacement: '$1$2 $3'
3355
3628
  brand_replacement: 'MyPhone'
3356
3629
  model_replacement: '$3'
3357
- - regex: '; *(A\d+)[ _](Duo|) Build'
3630
+ - regex: '; {0,2}(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3358
3631
  regex_flag: 'i'
3359
3632
  device_replacement: '$1 $2'
3360
3633
  brand_replacement: 'MyPhone'
@@ -3364,7 +3637,7 @@ device_parsers:
3364
3637
  # Mytab
3365
3638
  # @ref: http://www.mytab.eu/en/category/mytab-products/
3366
3639
  #########
3367
- - regex: '; *(myTab[^;/]*) Build'
3640
+ - regex: '; {0,2}(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3368
3641
  device_replacement: '$1'
3369
3642
  brand_replacement: 'Mytab'
3370
3643
  model_replacement: '$1'
@@ -3373,7 +3646,7 @@ device_parsers:
3373
3646
  # Nabi
3374
3647
  # @ref: https://www.nabitablet.com
3375
3648
  #########
3376
- - regex: '; *(NABI2?-)([^;/]+) Build/'
3649
+ - regex: '; {0,2}(NABI2?-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3377
3650
  device_replacement: '$1$2'
3378
3651
  brand_replacement: 'Nabi'
3379
3652
  model_replacement: '$2'
@@ -3382,15 +3655,15 @@ device_parsers:
3382
3655
  # Nec Medias
3383
3656
  # @ref: http://www.n-keitai.com/
3384
3657
  #########
3385
- - regex: '; *(N-\d+[CDE]) Build/'
3658
+ - regex: '; {0,2}(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3386
3659
  device_replacement: '$1'
3387
3660
  brand_replacement: 'Nec'
3388
3661
  model_replacement: '$1'
3389
- - regex: '; ?(NEC-)(.*) Build/'
3662
+ - regex: '; ?(NEC-)(.{0,200}?)(?: Build|\) AppleWebKit)'
3390
3663
  device_replacement: '$1$2'
3391
3664
  brand_replacement: 'Nec'
3392
3665
  model_replacement: '$2'
3393
- - regex: '; *(LT-NA7) Build/'
3666
+ - regex: '; {0,2}(LT-NA7)(?: Build|\) AppleWebKit)'
3394
3667
  device_replacement: '$1'
3395
3668
  brand_replacement: 'Nec'
3396
3669
  model_replacement: 'Lifetouch Note'
@@ -3399,7 +3672,7 @@ device_parsers:
3399
3672
  # Nextbook
3400
3673
  # @ref: http://nextbookusa.com
3401
3674
  #########
3402
- - regex: '; *(NXM\d+[A-z0-9_]*|Next\d[A-z0-9_ \-]*|NEXT\d[A-z0-9_ \-]*|Nextbook [A-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
3675
+ - regex: '; {0,2}(NXM\d+[A-Za-z0-9_]{0,50}|Next\d[A-Za-z0-9_ \-]{0,50}|NEXT\d[A-Za-z0-9_ \-]{0,50}|Nextbook [A-Za-z0-9_ ]{0,50}|DATAM803HC|M805)(?: Build|[\);])'
3403
3676
  device_replacement: '$1'
3404
3677
  brand_replacement: 'Nextbook'
3405
3678
  model_replacement: '$1'
@@ -3408,22 +3681,26 @@ device_parsers:
3408
3681
  # Nokia
3409
3682
  # @ref: http://www.nokia.com
3410
3683
  #########
3411
- - regex: '; *(Nokia)([ _\-]*)([^;/]*) Build'
3684
+ - regex: '; {0,2}(Nokia)([ _\-]{0,5})([^;/]{0,50}) Build'
3412
3685
  regex_flag: 'i'
3413
3686
  device_replacement: '$1$2$3'
3414
3687
  brand_replacement: 'Nokia'
3415
3688
  model_replacement: '$3'
3689
+ - regex: '; {0,2}(TA\-\d{4})(?: Build|\) AppleWebKit)'
3690
+ device_replacement: 'Nokia $1'
3691
+ brand_replacement: 'Nokia'
3692
+ model_replacement: '$1'
3416
3693
 
3417
3694
  #########
3418
3695
  # Nook
3419
3696
  # @ref:
3420
3697
  # TODO nook browser/1.0
3421
3698
  #########
3422
- - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+) Build'
3699
+ - regex: '; {0,2}(Nook ?|Barnes & Noble Nook |BN )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3423
3700
  device_replacement: '$1$2'
3424
3701
  brand_replacement: 'Nook'
3425
3702
  model_replacement: '$2'
3426
- - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build'
3703
+ - regex: '; {0,2}(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3427
3704
  device_replacement: '$1$2'
3428
3705
  brand_replacement: 'Nook'
3429
3706
  model_replacement: '$2'
@@ -3436,7 +3713,7 @@ device_parsers:
3436
3713
  # Olivetti
3437
3714
  # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
3438
3715
  #########
3439
- - regex: '; *(OP110|OliPad[^;/]+) Build'
3716
+ - regex: '; {0,2}(OP110|OliPad[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3440
3717
  device_replacement: 'Olivetti $1'
3441
3718
  brand_replacement: 'Olivetti'
3442
3719
  model_replacement: '$1'
@@ -3447,7 +3724,7 @@ device_parsers:
3447
3724
  # @note: MID tablets might get matched by CobyKyros first
3448
3725
  # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
3449
3726
  #########
3450
- - regex: '; *OMEGA[ _\-](MID[^;/]+) Build'
3727
+ - regex: '; {0,2}OMEGA[ _\-](MID[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3451
3728
  device_replacement: 'Omega $1'
3452
3729
  brand_replacement: 'Omega'
3453
3730
  model_replacement: '$1'
@@ -3460,7 +3737,7 @@ device_parsers:
3460
3737
  # OpenPeak
3461
3738
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
3462
3739
  #########
3463
- - regex: '; *((?:CIUS|cius)[^;/]*) Build'
3740
+ - regex: '; {0,2}((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3464
3741
  device_replacement: 'Openpeak $1'
3465
3742
  brand_replacement: 'Openpeak'
3466
3743
  model_replacement: '$1'
@@ -3469,33 +3746,40 @@ device_parsers:
3469
3746
  # Oppo
3470
3747
  # @ref: http://en.oppo.com/products/
3471
3748
  #########
3472
- - regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d{0,1}|U70\d{1,2}T?|X90\d{1,2}) Build'
3749
+ - regex: '; {0,2}(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d?|U70\d{1,2}T?|X90\d{1,2}|[AFR]\d{1,2}[a-z]{1,2})(?: Build|\) AppleWebKit)'
3473
3750
  device_replacement: 'Oppo $1'
3474
3751
  brand_replacement: 'Oppo'
3475
3752
  model_replacement: '$1'
3476
- - regex: '; *OPPO ?([^;/]+) Build/'
3753
+ - regex: '; {0,2}OPPO ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3477
3754
  device_replacement: 'Oppo $1'
3478
3755
  brand_replacement: 'Oppo'
3479
3756
  model_replacement: '$1'
3757
+ - regex: '; {0,2}(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3758
+ device_replacement: 'Oppo $1'
3759
+ brand_replacement: 'Oppo'
3760
+ - regex: '; {0,2}(A1601)(?: Build|\) AppleWebKit)'
3761
+ device_replacement: 'Oppo F1s'
3762
+ brand_replacement: 'Oppo'
3763
+ model_replacement: '$1'
3480
3764
 
3481
3765
  #########
3482
3766
  # Odys
3483
3767
  # @ref: http://odys.de
3484
3768
  #########
3485
- - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+) Build'
3769
+ - regex: '; {0,2}(?:Odys\-|ODYS\-|ODYS )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3486
3770
  device_replacement: 'Odys $1'
3487
3771
  brand_replacement: 'Odys'
3488
3772
  model_replacement: '$1'
3489
- - regex: '; *(SELECT) ?(7) Build'
3773
+ - regex: '; {0,2}(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3490
3774
  device_replacement: 'Odys $1 $2'
3491
3775
  brand_replacement: 'Odys'
3492
3776
  model_replacement: '$1 $2'
3493
- - regex: '; *(PEDI)_(PLUS)_(W) Build'
3777
+ - regex: '; {0,2}(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3494
3778
  device_replacement: 'Odys $1 $2 $3'
3495
3779
  brand_replacement: 'Odys'
3496
3780
  model_replacement: '$1 $2 $3'
3497
3781
  # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
3498
- - 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'
3782
+ - regex: '; {0,2}(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\) AppleWebKit)'
3499
3783
  device_replacement: 'Odys $1'
3500
3784
  brand_replacement: 'Odys'
3501
3785
  model_replacement: '$1'
@@ -3504,11 +3788,11 @@ device_parsers:
3504
3788
  # OnePlus
3505
3789
  # @ref https://oneplus.net/
3506
3790
  #########
3507
- - regex: '; (ONE [a-zA-Z]\d+) Build/'
3791
+ - regex: '; (ONE [a-zA-Z]\d+)(?: Build|\) AppleWebKit)'
3508
3792
  device_replacement: 'OnePlus $1'
3509
3793
  brand_replacement: 'OnePlus'
3510
3794
  model_replacement: '$1'
3511
- - regex: '; (ONEPLUS [a-zA-Z]\d+)(?: Build/|)'
3795
+ - regex: '; (ONEPLUS [a-zA-Z]\d+)(?: Build|\) AppleWebKit)'
3512
3796
  device_replacement: 'OnePlus $1'
3513
3797
  brand_replacement: 'OnePlus'
3514
3798
  model_replacement: '$1'
@@ -3517,7 +3801,7 @@ device_parsers:
3517
3801
  # Orion
3518
3802
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
3519
3803
  #########
3520
- - regex: '; *(TP-\d+) Build/'
3804
+ - regex: '; {0,2}(TP-\d+)(?: Build|\) AppleWebKit)'
3521
3805
  device_replacement: 'Orion $1'
3522
3806
  brand_replacement: 'Orion'
3523
3807
  model_replacement: '$1'
@@ -3526,7 +3810,7 @@ device_parsers:
3526
3810
  # PackardBell
3527
3811
  # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
3528
3812
  #########
3529
- - regex: '; *(G100W?) Build/'
3813
+ - regex: '; {0,2}(G100W?)(?: Build|\) AppleWebKit)'
3530
3814
  device_replacement: 'PackardBell $1'
3531
3815
  brand_replacement: 'PackardBell'
3532
3816
  model_replacement: '$1'
@@ -3537,17 +3821,17 @@ device_parsers:
3537
3821
  # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
3538
3822
  # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
3539
3823
  #########
3540
- - regex: '; *(Panasonic)[_ ]([^;/]+) Build'
3824
+ - regex: '; {0,2}(Panasonic)[_ ]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3541
3825
  device_replacement: '$1 $2'
3542
3826
  brand_replacement: '$1'
3543
3827
  model_replacement: '$2'
3544
3828
  # Toughpad
3545
- - regex: '; *(FZ-A1B|JT-B1) Build'
3829
+ - regex: '; {0,2}(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3546
3830
  device_replacement: 'Panasonic $1'
3547
3831
  brand_replacement: 'Panasonic'
3548
3832
  model_replacement: '$1'
3549
3833
  # Eluga Power
3550
- - regex: '; *(dL1|DL1) Build'
3834
+ - regex: '; {0,2}(dL1|DL1)(?: Build|\) AppleWebKit)'
3551
3835
  device_replacement: 'Panasonic $1'
3552
3836
  brand_replacement: 'Panasonic'
3553
3837
  model_replacement: '$1'
@@ -3558,15 +3842,15 @@ device_parsers:
3558
3842
  # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
3559
3843
  # @models: ADR8995, ADR910L, ADR930VW, C790, CDM8992, CDM8999, IS06, IS11PT, P2000, P2020, P2030, P4100, P5000, P6010, P6020, P6030, P7000, P7040, P8000, P8010, P9020, P9050, P9060, P9070, P9090, PT001, PT002, PT003, TXT8040, TXT8045, VEGA PTL21
3560
3844
  #########
3561
- - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
3845
+ - regex: '; {0,2}(SKY[ _]|)(IM\-[AT]\d{3}[^;/]{1,100}).{0,30} Build/'
3562
3846
  device_replacement: 'Pantech $1$2'
3563
3847
  brand_replacement: 'Pantech'
3564
3848
  model_replacement: '$1$2'
3565
- - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3849
+ - regex: '; {0,2}((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3566
3850
  device_replacement: '$1'
3567
3851
  brand_replacement: 'Pantech'
3568
3852
  model_replacement: '$1'
3569
- - regex: '; *Pantech([^;/]+).* Build/'
3853
+ - regex: '; {0,2}Pantech([^;/]{1,30}).{0,200}? Build/'
3570
3854
  device_replacement: 'Pantech $1'
3571
3855
  brand_replacement: 'Pantech'
3572
3856
  model_replacement: '$1'
@@ -3575,7 +3859,7 @@ device_parsers:
3575
3859
  # Papayre
3576
3860
  # @ref: http://grammata.es/
3577
3861
  #########
3578
- - regex: '; *(papyre)[ _\-]([^;/]+) Build/'
3862
+ - regex: '; {0,2}(papyre)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3579
3863
  regex_flag: 'i'
3580
3864
  device_replacement: '$1 $2'
3581
3865
  brand_replacement: 'Papyre'
@@ -3585,7 +3869,7 @@ device_parsers:
3585
3869
  # Pearl
3586
3870
  # @ref: http://www.pearl.de/c-1540.shtml
3587
3871
  #########
3588
- - regex: '; *(?:Touchlet )?(X10\.[^;/]+) Build/'
3872
+ - regex: '; {0,2}(?:Touchlet )?(X10\.[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3589
3873
  device_replacement: 'Pearl $1'
3590
3874
  brand_replacement: 'Pearl'
3591
3875
  model_replacement: '$1'
@@ -3594,15 +3878,15 @@ device_parsers:
3594
3878
  # Phicomm
3595
3879
  # @ref: http://www.phicomm.com.cn/
3596
3880
  #########
3597
- - regex: '; PHICOMM (i800) Build/'
3881
+ - regex: '; PHICOMM (i800)(?: Build|\) AppleWebKit)'
3598
3882
  device_replacement: 'Phicomm $1'
3599
3883
  brand_replacement: 'Phicomm'
3600
3884
  model_replacement: '$1'
3601
- - regex: '; PHICOMM ([^;/]+) Build/'
3885
+ - regex: '; PHICOMM ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3602
3886
  device_replacement: 'Phicomm $1'
3603
3887
  brand_replacement: 'Phicomm'
3604
3888
  model_replacement: '$1'
3605
- - regex: '; *(FWS\d{3}[^;/]+) Build/'
3889
+ - regex: '; {0,2}(FWS\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3606
3890
  device_replacement: 'Phicomm $1'
3607
3891
  brand_replacement: 'Phicomm'
3608
3892
  model_replacement: '$1'
@@ -3614,11 +3898,11 @@ device_parsers:
3614
3898
  # @ref: http://www.support.philips.com/support/catalog/products.jsp?_dyncharset=UTF-8&country=&categoryid=ENTERTAINMENT_TABLETS_SU_CN_CARE&userLanguage=en&navCount=0&groupId=&catalogType=&navAction=push&userCountry=cn&title=Entertainment+Tablets&cateId=TABLETS_CA_CN_CARE
3615
3899
  #########
3616
3900
  # @note: this a best guess according to available philips models. Need more User-Agents
3617
- - 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'
3901
+ - regex: '; {0,2}(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\) AppleWebKit)'
3618
3902
  device_replacement: '$1'
3619
3903
  brand_replacement: 'Philips'
3620
3904
  model_replacement: '$1'
3621
- - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+) Build'
3905
+ - regex: '; {0,2}(?:Philips|PHILIPS)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3622
3906
  device_replacement: 'Philips $1'
3623
3907
  brand_replacement: 'Philips'
3624
3908
  model_replacement: '$1'
@@ -3627,7 +3911,7 @@ device_parsers:
3627
3911
  # Pipo
3628
3912
  # @ref: http://www.pipo.cn/En/
3629
3913
  #########
3630
- - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)? Build'
3914
+ - regex: 'Android 4\..{0,200}; {0,2}(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3631
3915
  device_replacement: 'Pipo $1$2'
3632
3916
  brand_replacement: 'Pipo'
3633
3917
  model_replacement: '$1$2'
@@ -3636,7 +3920,7 @@ device_parsers:
3636
3920
  # Ployer
3637
3921
  # @ref: http://en.ployer.cn/
3638
3922
  #########
3639
- - regex: '; *(MOMO[^;/]+) Build'
3923
+ - regex: '; {0,2}(MOMO[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3640
3924
  device_replacement: '$1'
3641
3925
  brand_replacement: 'Ployer'
3642
3926
  model_replacement: '$1'
@@ -3645,11 +3929,11 @@ device_parsers:
3645
3929
  # Polaroid/ Acho
3646
3930
  # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
3647
3931
  #########
3648
- - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*|) Build/'
3932
+ - regex: '; {0,2}(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]{0,30}?)(\/[^;/]{0,30}|)(?: Build|\) AppleWebKit)'
3649
3933
  device_replacement: '$1'
3650
3934
  brand_replacement: 'Polaroid'
3651
3935
  model_replacement: '$1'
3652
- - regex: '; *(?:Polaroid )(Tablet) Build/'
3936
+ - regex: '; {0,2}(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3653
3937
  device_replacement: '$1'
3654
3938
  brand_replacement: 'Polaroid'
3655
3939
  model_replacement: '$1'
@@ -3659,7 +3943,7 @@ device_parsers:
3659
3943
  # @ref: http://pompmobileshop.com/
3660
3944
  #########
3661
3945
  #~ TODO
3662
- - regex: '; *(POMP)[ _\-](.+?) *(?:Build|[;/\)])'
3946
+ - regex: '; {0,2}(POMP)[ _\-](.{1,200}?) {0,2}(?:Build|[;/\)])'
3663
3947
  device_replacement: '$1 $2'
3664
3948
  brand_replacement: 'Pomp'
3665
3949
  model_replacement: '$2'
@@ -3668,11 +3952,11 @@ device_parsers:
3668
3952
  # Positivo
3669
3953
  # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
3670
3954
  #########
3671
- - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA) Build/'
3955
+ - regex: '; {0,2}(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3672
3956
  device_replacement: '$1'
3673
3957
  brand_replacement: 'Positivo'
3674
3958
  model_replacement: '$1'
3675
- - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+) Build/'
3959
+ - regex: '; {0,2}(?:Positivo |)((?:YPY|Ypy)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3676
3960
  device_replacement: '$1'
3677
3961
  brand_replacement: 'Positivo'
3678
3962
  model_replacement: '$1'
@@ -3682,15 +3966,15 @@ device_parsers:
3682
3966
  # @ref: http://www.pointofview-online.com/default2.php
3683
3967
  # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
3684
3968
  #########
3685
- - regex: '; *(MOB-[^;/]+) Build/'
3969
+ - regex: '; {0,2}(MOB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3686
3970
  device_replacement: '$1'
3687
3971
  brand_replacement: 'POV'
3688
3972
  model_replacement: '$1'
3689
- - regex: '; *POV[ _\-]([^;/]+) Build/'
3973
+ - regex: '; {0,2}POV[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3690
3974
  device_replacement: 'POV $1'
3691
3975
  brand_replacement: 'POV'
3692
3976
  model_replacement: '$1'
3693
- - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*) Build/'
3977
+ - regex: '; {0,2}((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3694
3978
  device_replacement: 'POV $1'
3695
3979
  brand_replacement: 'POV'
3696
3980
  model_replacement: '$1'
@@ -3700,7 +3984,7 @@ device_parsers:
3700
3984
  # @ref: http://www.prestigio.com/catalogue/MultiPhones
3701
3985
  # @ref: http://www.prestigio.com/catalogue/MultiPads
3702
3986
  #########
3703
- - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+) Build/'
3987
+ - regex: '; {0,2}(?:Prestigio |)((?:PAP|PMP)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3704
3988
  device_replacement: 'Prestigio $1'
3705
3989
  brand_replacement: 'Prestigio'
3706
3990
  model_replacement: '$1'
@@ -3709,7 +3993,7 @@ device_parsers:
3709
3993
  # Proscan
3710
3994
  # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
3711
3995
  #########
3712
- - regex: '; *(PLT[0-9]{4}.*) Build/'
3996
+ - regex: '; {0,2}(PLT[0-9]{4}.{0,200}?)(?: Build|\) AppleWebKit)'
3713
3997
  device_replacement: '$1'
3714
3998
  brand_replacement: 'Proscan'
3715
3999
  model_replacement: '$1'
@@ -3718,15 +4002,15 @@ device_parsers:
3718
4002
  # QMobile
3719
4003
  # @ref: http://www.qmobile.com.pk/
3720
4004
  #########
3721
- - regex: '; *(A2|A5|A8|A900)_?(Classic|) Build'
4005
+ - regex: '; {0,2}(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
3722
4006
  device_replacement: '$1 $2'
3723
4007
  brand_replacement: 'Qmobile'
3724
4008
  model_replacement: '$1 $2'
3725
- - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+) Build'
4009
+ - regex: '; {0,2}(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
3726
4010
  device_replacement: 'Qmobile $2 $3'
3727
4011
  brand_replacement: 'Qmobile'
3728
4012
  model_replacement: '$2 $3'
3729
- - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+) Build'
4013
+ - regex: '; {0,2}(Q\-?[Mm]obile)[_ ](A[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3730
4014
  device_replacement: 'Qmobile $2'
3731
4015
  brand_replacement: 'Qmobile'
3732
4016
  model_replacement: '$2'
@@ -3735,11 +4019,11 @@ device_parsers:
3735
4019
  # Qmobilevn
3736
4020
  # @ref: http://qmobile.vn/san-pham.html
3737
4021
  #########
3738
- - regex: '; *(Q\-Smart)[ _]([^;/]+) Build/'
4022
+ - regex: '; {0,2}(Q\-Smart)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3739
4023
  device_replacement: '$1 $2'
3740
4024
  brand_replacement: 'Qmobilevn'
3741
4025
  model_replacement: '$2'
3742
- - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+) Build/'
4026
+ - regex: '; {0,2}(Q\-?[Mm]obile)[ _\-](S[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3743
4027
  device_replacement: '$1 $2'
3744
4028
  brand_replacement: 'Qmobilevn'
3745
4029
  model_replacement: '$2'
@@ -3748,7 +4032,7 @@ device_parsers:
3748
4032
  # Quanta
3749
4033
  # @ref: ?
3750
4034
  #########
3751
- - regex: '; *(TA1013) Build'
4035
+ - regex: '; {0,2}(TA1013)(?: Build|\) AppleWebKit)'
3752
4036
  device_replacement: '$1'
3753
4037
  brand_replacement: 'Quanta'
3754
4038
  model_replacement: '$1'
@@ -3757,11 +4041,11 @@ device_parsers:
3757
4041
  # RCA
3758
4042
  # @ref: http://rcamobilephone.com/
3759
4043
  #########
3760
- - regex: '; (RCT\w+) Build/'
4044
+ - regex: '; (RCT\w+)(?: Build|\) AppleWebKit)'
3761
4045
  device_replacement: '$1'
3762
4046
  brand_replacement: 'RCA'
3763
4047
  model_replacement: '$1'
3764
- - regex: '; RCA (\w+) Build/'
4048
+ - regex: '; RCA (\w+)(?: Build|\) AppleWebKit)'
3765
4049
  device_replacement: 'RCA $1'
3766
4050
  brand_replacement: 'RCA'
3767
4051
  model_replacement: '$1'
@@ -3771,7 +4055,7 @@ device_parsers:
3771
4055
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
3772
4056
  # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
3773
4057
  #########
3774
- - regex: '; *(RK\d+),? Build/'
4058
+ - regex: '; {0,2}(RK\d+),?(?: Build|\) AppleWebKit)'
3775
4059
  device_replacement: '$1'
3776
4060
  brand_replacement: 'Rockchip'
3777
4061
  model_replacement: '$1'
@@ -3784,55 +4068,55 @@ device_parsers:
3784
4068
  # Samsung Android Devices
3785
4069
  # @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
3786
4070
  #########
3787
- - regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
4071
+ - regex: '; {0,2}(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]{0,100})\/?[^;/]{0,50} Build/'
3788
4072
  device_replacement: 'Samsung $1$2'
3789
4073
  brand_replacement: 'Samsung'
3790
4074
  model_replacement: '$2'
3791
- - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
4075
+ - regex: '; {0,2}(Google |)(Nexus [Ss](?: 4G|)) Build/'
3792
4076
  device_replacement: 'Samsung $1$2'
3793
4077
  brand_replacement: 'Samsung'
3794
4078
  model_replacement: '$2'
3795
- - regex: '; *(SAMSUNG |Samsung )([^\/]*)\/[^ ]* Build/'
4079
+ - regex: '; {0,2}(SAMSUNG |Samsung )([^\/]{0,50})\/[^ ]{0,50} Build/'
3796
4080
  device_replacement: 'Samsung $2'
3797
4081
  brand_replacement: 'Samsung'
3798
4082
  model_replacement: '$2'
3799
- - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
4083
+ - regex: '; {0,2}(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
3800
4084
  device_replacement: 'Samsung $1'
3801
4085
  brand_replacement: 'Samsung'
3802
4086
  model_replacement: '$1'
3803
- - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
4087
+ - regex: '; {0,2}(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]{1,100}) Build'
3804
4088
  device_replacement: 'Samsung $2'
3805
4089
  brand_replacement: 'Samsung'
3806
4090
  model_replacement: '$2'
3807
- - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
4091
+ - regex: '; {0,2}(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]{0,50})(\/[^ ]{0,50}) Build'
3808
4092
  device_replacement: 'Samsung $1$2$3'
3809
4093
  brand_replacement: 'Samsung'
3810
4094
  model_replacement: '$2'
3811
- - regex: '(?:; *|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
4095
+ - regex: '(?:; {0,2}|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
3812
4096
  device_replacement: 'Samsung $1'
3813
4097
  brand_replacement: 'Samsung'
3814
4098
  model_replacement: '$1'
3815
- - regex: '; (SAMSUNG-)([A-Za-z0-9\-]+).* Build/'
4099
+ - regex: '; (SAMSUNG-)([A-Za-z0-9\-]{0,50}).{0,200} Build/'
3816
4100
  device_replacement: 'Samsung $1$2'
3817
4101
  brand_replacement: 'Samsung'
3818
4102
  model_replacement: '$2'
3819
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4103
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3820
4104
  device_replacement: 'Samsung $1'
3821
4105
  brand_replacement: 'Samsung'
3822
4106
  model_replacement: '$1'
3823
- - regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
4107
+ - regex: '; {0,2}((?:SC)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|)\)'
3824
4108
  device_replacement: 'Samsung $1'
3825
4109
  brand_replacement: 'Samsung'
3826
4110
  model_replacement: '$1'
3827
- - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4111
+ - regex: ' ((?:SCH)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3828
4112
  device_replacement: 'Samsung $1'
3829
4113
  brand_replacement: 'Samsung'
3830
4114
  model_replacement: '$1'
3831
- - regex: '; *(Behold ?(?:2|II)|YP\-G[^;/]+|EK-GC100|SCL21|I9300) Build'
4115
+ - regex: '; {0,2}(Behold ?(?:2|II)|YP\-G[^;/]{1,100}|EK-GC100|SCL21|I9300) Build'
3832
4116
  device_replacement: 'Samsung $1'
3833
4117
  brand_replacement: 'Samsung'
3834
4118
  model_replacement: '$1'
3835
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
4119
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
3836
4120
  device_replacement: 'Samsung $1'
3837
4121
  brand_replacement: 'Samsung'
3838
4122
  model_replacement: '$1'
@@ -3842,11 +4126,11 @@ device_parsers:
3842
4126
  # @ref: http://www.sharp-phone.com/en/index.html
3843
4127
  # @ref: http://www.android.com/devices/?country=all&m=sharp
3844
4128
  #########
3845
- - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+) Build'
4129
+ - regex: '; {0,2}(SH\-?\d\d[^;/]{1,100}|SBM\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3846
4130
  device_replacement: '$1'
3847
4131
  brand_replacement: 'Sharp'
3848
4132
  model_replacement: '$1'
3849
- - regex: '; *(SHARP[ -])([^;/]+) Build'
4133
+ - regex: '; {0,2}(SHARP[ -])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3850
4134
  device_replacement: '$1$2'
3851
4135
  brand_replacement: 'Sharp'
3852
4136
  model_replacement: '$2'
@@ -3855,15 +4139,15 @@ device_parsers:
3855
4139
  # Simvalley
3856
4140
  # @ref: http://www.simvalley-mobile.de/
3857
4141
  #########
3858
- - regex: '; *(SPX[_\-]\d[^;/]*) Build/'
4142
+ - regex: '; {0,2}(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
3859
4143
  device_replacement: '$1'
3860
4144
  brand_replacement: 'Simvalley'
3861
4145
  model_replacement: '$1'
3862
- - regex: '; *(SX7\-PEARL\.GmbH) Build/'
4146
+ - regex: '; {0,2}(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
3863
4147
  device_replacement: '$1'
3864
4148
  brand_replacement: 'Simvalley'
3865
4149
  model_replacement: '$1'
3866
- - regex: '; *(SP[T]?\-\d{2}[^;/]*) Build/'
4150
+ - regex: '; {0,2}(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
3867
4151
  device_replacement: '$1'
3868
4152
  brand_replacement: 'Simvalley'
3869
4153
  model_replacement: '$1'
@@ -3873,7 +4157,7 @@ device_parsers:
3873
4157
  # @ref: http://www.sk-w.com/phone/phone_list.jsp
3874
4158
  # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
3875
4159
  #########
3876
- - regex: '; *(SK\-.*) Build/'
4160
+ - regex: '; {0,2}(SK\-.{0,200}?)(?: Build|\) AppleWebKit)'
3877
4161
  device_replacement: '$1'
3878
4162
  brand_replacement: 'SKtelesys'
3879
4163
  model_replacement: '$1'
@@ -3882,11 +4166,11 @@ device_parsers:
3882
4166
  # Skytex
3883
4167
  # @ref: http://skytex.com/android
3884
4168
  #########
3885
- - regex: '; *(?:SKYTEX|SX)-([^;/]+) Build'
4169
+ - regex: '; {0,2}(?:SKYTEX|SX)-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3886
4170
  device_replacement: '$1'
3887
4171
  brand_replacement: 'Skytex'
3888
4172
  model_replacement: '$1'
3889
- - regex: '; *(IMAGINE [^;/]+) Build'
4173
+ - regex: '; {0,2}(IMAGINE [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3890
4174
  device_replacement: '$1'
3891
4175
  brand_replacement: 'Skytex'
3892
4176
  model_replacement: '$1'
@@ -3896,7 +4180,7 @@ device_parsers:
3896
4180
  # @ref: http://en.smartdevices.com.cn/Products/
3897
4181
  # @models: Z8, X7, U7H, U7, T30, T20, Ten3, V5-II, T7-3G, SmartQ5, K7, S7, Q8, T19, Ten2, Ten, R10, T7, R7, V5, V7, SmartQ7
3898
4182
  #########
3899
- - regex: '; *(SmartQ) ?([^;/]+) Build/'
4183
+ - regex: '; {0,2}(SmartQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3900
4184
  device_replacement: '$1 $2'
3901
4185
  brand_replacement: '$1'
3902
4186
  model_replacement: '$2'
@@ -3906,7 +4190,7 @@ device_parsers:
3906
4190
  # @ref: http://www.smartbitt.com/
3907
4191
  # @missing: SBT Useragents
3908
4192
  #########
3909
- - regex: '; *(WF7C|WF10C|SBT[^;/]+) Build'
4193
+ - regex: '; {0,2}(WF7C|WF10C|SBT[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3910
4194
  device_replacement: '$1'
3911
4195
  brand_replacement: 'Smartbitt'
3912
4196
  model_replacement: '$1'
@@ -3915,15 +4199,15 @@ device_parsers:
3915
4199
  # Softbank (Operator Branded Devices)
3916
4200
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
3917
4201
  #########
3918
- - regex: '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4202
+ - regex: '; {0,2}(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
3919
4203
  device_replacement: '$1'
3920
4204
  brand_replacement: 'Sharp'
3921
4205
  model_replacement: '$1'
3922
- - regex: '; *(003P|101P|101P11C|102P) Build'
4206
+ - regex: '; {0,2}(003P|101P|101P11C|102P) Build'
3923
4207
  device_replacement: '$1'
3924
4208
  brand_replacement: 'Panasonic'
3925
4209
  model_replacement: '$1'
3926
- - regex: '; *(00\dZ) Build/'
4210
+ - regex: '; {0,2}(00\dZ) Build/'
3927
4211
  device_replacement: '$1'
3928
4212
  brand_replacement: 'ZTE'
3929
4213
  model_replacement: '$1'
@@ -3931,11 +4215,11 @@ device_parsers:
3931
4215
  device_replacement: '$1'
3932
4216
  brand_replacement: 'HTC'
3933
4217
  model_replacement: '$1'
3934
- - regex: '; *(001HT|X06HT) Build'
4218
+ - regex: '; {0,2}(001HT|X06HT) Build'
3935
4219
  device_replacement: '$1'
3936
4220
  brand_replacement: 'HTC'
3937
4221
  model_replacement: '$1'
3938
- - regex: '; *(201M) Build'
4222
+ - regex: '; {0,2}(201M) Build'
3939
4223
  device_replacement: '$1'
3940
4224
  brand_replacement: 'Motorola'
3941
4225
  model_replacement: 'XT902'
@@ -3945,11 +4229,11 @@ device_parsers:
3945
4229
  # @ref: http://www.trekstor.co.uk/surftabs-en.html
3946
4230
  # @note: Must come before SonyEricsson
3947
4231
  #########
3948
- - regex: '; *(ST\d{4}.*)Build/ST'
4232
+ - regex: '; {0,2}(ST\d{4}.{0,200})Build/ST'
3949
4233
  device_replacement: 'Trekstor $1'
3950
4234
  brand_replacement: 'Trekstor'
3951
4235
  model_replacement: '$1'
3952
- - regex: '; *(ST\d{4}.*) Build/'
4236
+ - regex: '; {0,2}(ST\d{4}.{0,200}?)(?: Build|\) AppleWebKit)'
3953
4237
  device_replacement: 'Trekstor $1'
3954
4238
  brand_replacement: 'Trekstor'
3955
4239
  model_replacement: '$1'
@@ -3961,16 +4245,16 @@ device_parsers:
3961
4245
  # @TODO: type!
3962
4246
  #########
3963
4247
  # android matchers
3964
- - regex: '; *(Sony ?Ericsson ?)([^;/]+) Build'
4248
+ - regex: '; {0,2}(Sony ?Ericsson ?)([^;/]{1,100}) Build'
3965
4249
  device_replacement: '$1$2'
3966
4250
  brand_replacement: 'SonyEricsson'
3967
4251
  model_replacement: '$2'
3968
- - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4252
+ - regex: '; {0,2}((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
3969
4253
  device_replacement: '$1'
3970
4254
  brand_replacement: 'SonyEricsson'
3971
4255
  model_replacement: '$1'
3972
4256
  # TODO X\d+ is wrong
3973
- - regex: '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]*) Build'
4257
+ - regex: '; {0,2}(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]{0,50}) Build'
3974
4258
  regex_flag: 'i'
3975
4259
  device_replacement: '$1'
3976
4260
  brand_replacement: 'SonyEricsson'
@@ -3982,31 +4266,31 @@ device_parsers:
3982
4266
  # @ref: http://www.sonymobile.com/global-en/products/phones/
3983
4267
  # @ref: http://www.sony.jp/tablet/
3984
4268
  #########
3985
- - regex: '; Sony (Tablet[^;/]+) Build'
4269
+ - regex: '; Sony (Tablet[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3986
4270
  device_replacement: 'Sony $1'
3987
4271
  brand_replacement: 'Sony'
3988
4272
  model_replacement: '$1'
3989
- - regex: '; Sony ([^;/]+) Build'
4273
+ - regex: '; Sony ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3990
4274
  device_replacement: 'Sony $1'
3991
4275
  brand_replacement: 'Sony'
3992
4276
  model_replacement: '$1'
3993
- - regex: '; *(Sony)([A-Za-z0-9\-]+) Build'
4277
+ - regex: '; {0,2}(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
3994
4278
  device_replacement: '$1 $2'
3995
4279
  brand_replacement: '$1'
3996
4280
  model_replacement: '$2'
3997
- - regex: '; *(Xperia [^;/]+) Build'
4281
+ - regex: '; {0,2}(Xperia [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3998
4282
  device_replacement: '$1'
3999
4283
  brand_replacement: 'Sony'
4000
4284
  model_replacement: '$1'
4001
- - 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'
4285
+ - regex: '; {0,2}(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2})(?: Build|\) AppleWebKit)'
4002
4286
  device_replacement: '$1'
4003
4287
  brand_replacement: 'Sony'
4004
4288
  model_replacement: '$1'
4005
- - regex: '; *(SGP\d{3}|SGPT\d{2}) Build'
4289
+ - regex: '; {0,2}(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4006
4290
  device_replacement: '$1'
4007
4291
  brand_replacement: 'Sony'
4008
4292
  model_replacement: '$1'
4009
- - regex: '; *(NW-Z1000Series) Build'
4293
+ - regex: '; {0,2}(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4010
4294
  device_replacement: '$1'
4011
4295
  brand_replacement: 'Sony'
4012
4296
  model_replacement: '$1'
@@ -4029,7 +4313,7 @@ device_parsers:
4029
4313
  # Spice
4030
4314
  # @ref: http://www.spicemobilephones.co.in/
4031
4315
  #########
4032
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*) Build/'
4316
+ - regex: '; {0,2}((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4033
4317
  device_replacement: '$1$2$3$4'
4034
4318
  brand_replacement: 'Spice'
4035
4319
  model_replacement: 'Mi$4'
@@ -4038,7 +4322,7 @@ device_parsers:
4038
4322
  # Sprint (Operator Branded Devices)
4039
4323
  # @ref:
4040
4324
  #########
4041
- - regex: '; *(Sprint )(.+?) *(?:Build|[;/])'
4325
+ - regex: '; {0,2}(Sprint )(.{1,200}?) {0,2}(?:Build|[;/])'
4042
4326
  device_replacement: '$1$2'
4043
4327
  brand_replacement: 'Sprint'
4044
4328
  model_replacement: '$2'
@@ -4051,7 +4335,7 @@ device_parsers:
4051
4335
  # Tagi
4052
4336
  # @ref: ??
4053
4337
  #########
4054
- - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+) Build/'
4338
+ - regex: '; {0,2}(TAGI[ ]?)(MID) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4055
4339
  device_replacement: '$1$2$3'
4056
4340
  brand_replacement: 'Tagi'
4057
4341
  model_replacement: '$2$3'
@@ -4060,7 +4344,7 @@ device_parsers:
4060
4344
  # Tecmobile
4061
4345
  # @ref: http://www.tecmobile.com/
4062
4346
  #########
4063
- - regex: '; *(Oyster500|Opal 800) Build'
4347
+ - regex: '; {0,2}(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4064
4348
  device_replacement: 'Tecmobile $1'
4065
4349
  brand_replacement: 'Tecmobile'
4066
4350
  model_replacement: '$1'
@@ -4069,7 +4353,7 @@ device_parsers:
4069
4353
  # Tecno
4070
4354
  # @ref: www.tecno-mobile.com/‎
4071
4355
  #########
4072
- - regex: '; *(TECNO[ _])([^;/]+) Build/'
4356
+ - regex: '; {0,2}(TECNO[ _])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4073
4357
  device_replacement: '$1$2'
4074
4358
  brand_replacement: 'Tecno'
4075
4359
  model_replacement: '$2'
@@ -4078,7 +4362,7 @@ device_parsers:
4078
4362
  # Telechips, Techvision evaluation boards
4079
4363
  # @ref:
4080
4364
  #########
4081
- - regex: '; *Android for (Telechips|Techvision) ([^ ]+) '
4365
+ - regex: '; {0,2}Android for (Telechips|Techvision) ([^ ]+) '
4082
4366
  regex_flag: 'i'
4083
4367
  device_replacement: '$1 $2'
4084
4368
  brand_replacement: '$1'
@@ -4089,7 +4373,7 @@ device_parsers:
4089
4373
  # @ref: http://www.telstra.com.au/home-phone/thub-2/
4090
4374
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
4091
4375
  #########
4092
- - regex: '; *(T-Hub2) Build/'
4376
+ - regex: '; {0,2}(T-Hub2)(?: Build|\) AppleWebKit)'
4093
4377
  device_replacement: '$1'
4094
4378
  brand_replacement: 'Telstra'
4095
4379
  model_replacement: '$1'
@@ -4098,7 +4382,7 @@ device_parsers:
4098
4382
  # Terra
4099
4383
  # @ref: http://www.wortmann.de/
4100
4384
  #########
4101
- - regex: '; *(PAD) ?(100[12]) Build/'
4385
+ - regex: '; {0,2}(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4102
4386
  device_replacement: 'Terra $1$2'
4103
4387
  brand_replacement: 'Terra'
4104
4388
  model_replacement: '$1$2'
@@ -4107,7 +4391,7 @@ device_parsers:
4107
4391
  # Texet
4108
4392
  # @ref: http://www.texet.ru/tablet/
4109
4393
  #########
4110
- - regex: '; *(T[BM]-\d{3}[^;/]+) Build/'
4394
+ - regex: '; {0,2}(T[BM]-\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4111
4395
  device_replacement: '$1'
4112
4396
  brand_replacement: 'Texet'
4113
4397
  model_replacement: '$1'
@@ -4116,11 +4400,11 @@ device_parsers:
4116
4400
  # Thalia
4117
4401
  # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
4118
4402
  #########
4119
- - regex: '; *(tolino [^;/]+) Build'
4403
+ - regex: '; {0,2}(tolino [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4120
4404
  device_replacement: '$1'
4121
4405
  brand_replacement: 'Thalia'
4122
4406
  model_replacement: '$1'
4123
- - regex: '; *Build/.* (TOLINO_BROWSER)'
4407
+ - regex: '; {0,2}Build/.{0,200} (TOLINO_BROWSER)'
4124
4408
  device_replacement: '$1'
4125
4409
  brand_replacement: 'Thalia'
4126
4410
  model_replacement: 'Tolino Shine'
@@ -4130,11 +4414,11 @@ device_parsers:
4130
4414
  # @ref: http://en.thl.com.cn/Mobile
4131
4415
  # @ref: http://thlmobilestore.com
4132
4416
  #########
4133
- - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+) Build/'
4417
+ - regex: '; {0,2}(?:CJ[ -])?(ThL|THL)[ -]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4134
4418
  device_replacement: '$1 $2'
4135
4419
  brand_replacement: 'Thl'
4136
4420
  model_replacement: '$2'
4137
- - regex: '; *(T100|T200|T5|W100|W200|W8s) Build/'
4421
+ - regex: '; {0,2}(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4138
4422
  device_replacement: '$1'
4139
4423
  brand_replacement: 'Thl'
4140
4424
  model_replacement: '$1'
@@ -4143,28 +4427,28 @@ device_parsers:
4143
4427
  # T-Mobile (Operator Branded Devices)
4144
4428
  #########
4145
4429
  # @ref: https://en.wikipedia.org/wiki/HTC_Hero
4146
- - regex: '; *(T-Mobile[ _]G2[ _]Touch) Build'
4430
+ - regex: '; {0,2}(T-Mobile[ _]G2[ _]Touch) Build'
4147
4431
  device_replacement: '$1'
4148
4432
  brand_replacement: 'HTC'
4149
4433
  model_replacement: 'Hero'
4150
4434
  # @ref: https://en.wikipedia.org/wiki/HTC_Desire_Z
4151
- - regex: '; *(T-Mobile[ _]G2) Build'
4435
+ - regex: '; {0,2}(T-Mobile[ _]G2) Build'
4152
4436
  device_replacement: '$1'
4153
4437
  brand_replacement: 'HTC'
4154
4438
  model_replacement: 'Desire Z'
4155
- - regex: '; *(T-Mobile myTouch Q) Build'
4439
+ - regex: '; {0,2}(T-Mobile myTouch Q) Build'
4156
4440
  device_replacement: '$1'
4157
4441
  brand_replacement: 'Huawei'
4158
4442
  model_replacement: 'U8730'
4159
- - regex: '; *(T-Mobile myTouch) Build'
4443
+ - regex: '; {0,2}(T-Mobile myTouch) Build'
4160
4444
  device_replacement: '$1'
4161
4445
  brand_replacement: 'Huawei'
4162
4446
  model_replacement: 'U8680'
4163
- - regex: '; *(T-Mobile_Espresso) Build'
4447
+ - regex: '; {0,2}(T-Mobile_Espresso) Build'
4164
4448
  device_replacement: '$1'
4165
4449
  brand_replacement: 'HTC'
4166
4450
  model_replacement: 'Espresso'
4167
- - regex: '; *(T-Mobile G1) Build'
4451
+ - regex: '; {0,2}(T-Mobile G1) Build'
4168
4452
  device_replacement: '$1'
4169
4453
  brand_replacement: 'HTC'
4170
4454
  model_replacement: 'Dream'
@@ -4172,11 +4456,11 @@ device_parsers:
4172
4456
  device_replacement: '$1$2 $3 $4'
4173
4457
  brand_replacement: 'HTC'
4174
4458
  model_replacement: '$2 $3 $4'
4175
- - regex: '\b(T-Mobile)_([^_]+)_(.*) Build'
4459
+ - regex: '\b(T-Mobile)_([^_]+)_(.{0,200}) Build'
4176
4460
  device_replacement: '$1 $2 $3'
4177
4461
  brand_replacement: 'Tmobile'
4178
4462
  model_replacement: '$2 $3'
4179
- - regex: '\b(T-Mobile)[_ ]?(.*?)Build'
4463
+ - regex: '\b(T-Mobile)[_ ]?(.{0,200}?)Build'
4180
4464
  device_replacement: '$1 $2'
4181
4465
  brand_replacement: 'Tmobile'
4182
4466
  model_replacement: '$2'
@@ -4185,7 +4469,7 @@ device_parsers:
4185
4469
  # Tomtec
4186
4470
  # @ref: http://www.tom-tec.eu/pages/tablets.php
4187
4471
  #########
4188
- - regex: ' (ATP[0-9]{4}) Build'
4472
+ - regex: ' (ATP[0-9]{4})(?: Build|\) AppleWebKit)'
4189
4473
  device_replacement: '$1'
4190
4474
  brand_replacement: 'Tomtec'
4191
4475
  model_replacement: '$1'
@@ -4194,7 +4478,7 @@ device_parsers:
4194
4478
  # Tooky
4195
4479
  # @ref: http://www.tookymobile.com/
4196
4480
  #########
4197
- - regex: ' *(TOOKY)[ _\-]([^;/]+) ?(?:Build|;)'
4481
+ - regex: ' ?(TOOKY)[ _\-]([^;/]{1,100}) ?(?:Build|;)'
4198
4482
  regex_flag: 'i'
4199
4483
  device_replacement: '$1 $2'
4200
4484
  brand_replacement: 'Tooky'
@@ -4209,11 +4493,11 @@ device_parsers:
4209
4493
  device_replacement: '$1'
4210
4494
  brand_replacement: 'Toshiba'
4211
4495
  model_replacement: 'Folio 100'
4212
- - regex: '; *([Ff]olio ?100) Build/'
4496
+ - regex: '; {0,2}([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4213
4497
  device_replacement: '$1'
4214
4498
  brand_replacement: 'Toshiba'
4215
4499
  model_replacement: 'Folio 100'
4216
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/'
4500
+ - regex: '; {0,2}(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]{1,100}|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4217
4501
  device_replacement: 'Toshiba $1'
4218
4502
  brand_replacement: 'Toshiba'
4219
4503
  model_replacement: '$1'
@@ -4222,12 +4506,12 @@ device_parsers:
4222
4506
  # Touchmate
4223
4507
  # @ref: http://touchmatepc.com/new/
4224
4508
  #########
4225
- - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750) Build'
4509
+ - regex: '; {0,2}(TM-MID\d+[^;/]{1,50}|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4226
4510
  device_replacement: '$1'
4227
4511
  brand_replacement: 'Touchmate'
4228
4512
  model_replacement: '$1'
4229
4513
  # @todo: needs verification user-agents missing
4230
- - regex: '; *(TM-SM\d+[^;/]+) Build'
4514
+ - regex: '; {0,2}(TM-SM\d+[^;/]{1,50}?)(?: Build|\) AppleWebKit)'
4231
4515
  device_replacement: '$1'
4232
4516
  brand_replacement: 'Touchmate'
4233
4517
  model_replacement: '$1'
@@ -4236,11 +4520,11 @@ device_parsers:
4236
4520
  # Treq
4237
4521
  # @ref: http://www.treq.co.id/product
4238
4522
  #########
4239
- - regex: '; *(A10 [Bb]asic2?) Build/'
4523
+ - regex: '; {0,2}(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4240
4524
  device_replacement: '$1'
4241
4525
  brand_replacement: 'Treq'
4242
4526
  model_replacement: '$1'
4243
- - regex: '; *(TREQ[ _\-])([^;/]+) Build'
4527
+ - regex: '; {0,2}(TREQ[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4244
4528
  regex_flag: 'i'
4245
4529
  device_replacement: '$1$2'
4246
4530
  brand_replacement: 'Treq'
@@ -4252,21 +4536,40 @@ device_parsers:
4252
4536
  # @models: A936|A603|X-5|X-3
4253
4537
  #########
4254
4538
  # @todo: guessed markers
4255
- - regex: '; *(X-?5|X-?3) Build/'
4539
+ - regex: '; {0,2}(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4256
4540
  device_replacement: '$1'
4257
4541
  brand_replacement: 'Umeox'
4258
4542
  model_replacement: '$1'
4259
4543
  # @todo: guessed markers
4260
- - regex: '; *(A502\+?|A936|A603|X1|X2) Build/'
4544
+ - regex: '; {0,2}(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4261
4545
  device_replacement: '$1'
4262
4546
  brand_replacement: 'Umeox'
4263
4547
  model_replacement: '$1'
4264
4548
 
4549
+ #########
4550
+ # Vernee
4551
+ # @ref: http://vernee.cc/
4552
+ # @models: Thor - Thor E
4553
+ #########
4554
+ - regex: '; thor Build/'
4555
+ device_replacement: 'Thor'
4556
+ brand_replacement: 'Vernee'
4557
+ model_replacement: 'Thor'
4558
+ # Regex to modidy for Thor Plus (don't find example UA)
4559
+ - regex: '; Thor (E)? Build/'
4560
+ device_replacement: 'Thor $1'
4561
+ brand_replacement: 'Vernee'
4562
+ model_replacement: 'Thor'
4563
+ - regex: '; Apollo Lite Build/'
4564
+ device_replacement: 'Apollo Lite'
4565
+ brand_replacement: 'Vernee'
4566
+ model_replacement: 'Apollo'
4567
+
4265
4568
  #########
4266
4569
  # Versus
4267
4570
  # @ref: http://versusuk.com/support.html
4268
4571
  #########
4269
- - regex: '(TOUCH(?:TAB|PAD).+?) Build/'
4572
+ - regex: '(TOUCH(?:TAB|PAD).{1,200}?)(?: Build|\) AppleWebKit)'
4270
4573
  regex_flag: 'i'
4271
4574
  device_replacement: 'Versus $1'
4272
4575
  brand_replacement: 'Versus'
@@ -4276,7 +4579,7 @@ device_parsers:
4276
4579
  # Vertu
4277
4580
  # @ref: http://www.vertu.com/
4278
4581
  #########
4279
- - regex: '(VERTU) ([^;/]+) Build/'
4582
+ - regex: '(VERTU) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4280
4583
  device_replacement: '$1 $2'
4281
4584
  brand_replacement: 'Vertu'
4282
4585
  model_replacement: '$2'
@@ -4285,11 +4588,11 @@ device_parsers:
4285
4588
  # Videocon
4286
4589
  # @ref: http://www.videoconmobiles.com
4287
4590
  #########
4288
- - regex: '; *(Videocon)[ _\-]([^;/]+) *(?:Build|;)'
4591
+ - regex: '; {0,2}(Videocon)[ _\-]([^;/]{1,100}?) {0,2}(?:Build|;)'
4289
4592
  device_replacement: '$1 $2'
4290
4593
  brand_replacement: 'Videocon'
4291
4594
  model_replacement: '$2'
4292
- - regex: ' (VT\d{2}[A-Za-z]*) Build'
4595
+ - regex: ' (VT\d{2}[A-Za-z]*)(?: Build|\) AppleWebKit)'
4293
4596
  device_replacement: '$1'
4294
4597
  brand_replacement: 'Videocon'
4295
4598
  model_replacement: '$1'
@@ -4298,15 +4601,15 @@ device_parsers:
4298
4601
  # Viewsonic
4299
4602
  # @ref: http://viewsonic.com
4300
4603
  #########
4301
- - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+) Build/'
4604
+ - regex: '; {0,2}((?:ViewPad|ViewPhone|VSD)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4302
4605
  device_replacement: '$1'
4303
4606
  brand_replacement: 'Viewsonic'
4304
4607
  model_replacement: '$1'
4305
- - regex: '; *(ViewSonic-)([^;/]+) Build/'
4608
+ - regex: '; {0,2}(ViewSonic-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4306
4609
  device_replacement: '$1$2'
4307
4610
  brand_replacement: 'Viewsonic'
4308
4611
  model_replacement: '$2'
4309
- - regex: '; *(GTablet.*) Build/'
4612
+ - regex: '; {0,2}(GTablet.{0,200}?)(?: Build|\) AppleWebKit)'
4310
4613
  device_replacement: '$1'
4311
4614
  brand_replacement: 'Viewsonic'
4312
4615
  model_replacement: '$1'
@@ -4315,7 +4618,7 @@ device_parsers:
4315
4618
  # vivo
4316
4619
  # @ref: http://vivo.cn/
4317
4620
  #########
4318
- - regex: '; *([Vv]ivo)[ _]([^;/]+) Build'
4621
+ - regex: '; {0,2}([Vv]ivo)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4319
4622
  device_replacement: '$1 $2'
4320
4623
  brand_replacement: 'vivo'
4321
4624
  model_replacement: '$2'
@@ -4324,7 +4627,7 @@ device_parsers:
4324
4627
  # Vodafone (Operator Branded Devices)
4325
4628
  # @ref: ??
4326
4629
  #########
4327
- - regex: '(Vodafone) (.*) Build/'
4630
+ - regex: '(Vodafone) (.{0,200}?)(?: Build|\) AppleWebKit)'
4328
4631
  device_replacement: '$1 $2'
4329
4632
  brand_replacement: '$1'
4330
4633
  model_replacement: '$2'
@@ -4333,7 +4636,7 @@ device_parsers:
4333
4636
  # Walton
4334
4637
  # @ref: http://www.waltonbd.com/
4335
4638
  #########
4336
- - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+) Build'
4639
+ - regex: '; {0,2}(?:Walton[ _\-]|)(Primo[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4337
4640
  regex_flag: 'i'
4338
4641
  device_replacement: 'Walton $1'
4339
4642
  brand_replacement: 'Walton'
@@ -4343,7 +4646,7 @@ device_parsers:
4343
4646
  # Wiko
4344
4647
  # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
4345
4648
  #########
4346
- - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/'
4649
+ - regex: '; {0,2}(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4347
4650
  regex_flag: 'i'
4348
4651
  device_replacement: 'Wiko $1'
4349
4652
  brand_replacement: 'Wiko'
@@ -4353,7 +4656,7 @@ device_parsers:
4353
4656
  # WellcoM
4354
4657
  # @ref: ??
4355
4658
  #########
4356
- - regex: '; *WellcoM-([^;/]+) Build'
4659
+ - regex: '; {0,2}WellcoM-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4357
4660
  device_replacement: 'Wellcom $1'
4358
4661
  brand_replacement: 'Wellcom'
4359
4662
  model_replacement: '$1'
@@ -4371,7 +4674,7 @@ device_parsers:
4371
4674
  # Wolfgang
4372
4675
  # @ref: http://wolfgangmobile.com/
4373
4676
  #########
4374
- - regex: '; *(AT-AS[^;/]+) Build'
4677
+ - regex: '; {0,2}(AT-AS[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4375
4678
  device_replacement: 'Wolfgang $1'
4376
4679
  brand_replacement: 'Wolfgang'
4377
4680
  model_replacement: '$1'
@@ -4380,7 +4683,7 @@ device_parsers:
4380
4683
  # Woxter
4381
4684
  # @ref: http://www.woxter.es/es-es/categories/index
4382
4685
  #########
4383
- - regex: '; *(?:Woxter|Wxt) ([^;/]+) Build'
4686
+ - regex: '; {0,2}(?:Woxter|Wxt) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4384
4687
  device_replacement: 'Woxter $1'
4385
4688
  brand_replacement: 'Woxter'
4386
4689
  model_replacement: '$1'
@@ -4389,7 +4692,7 @@ device_parsers:
4389
4692
  # Yarvik Zania
4390
4693
  # @ref: http://yarvik.com
4391
4694
  #########
4392
- - 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/'
4695
+ - regex: '; {0,2}(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3})(?: Build|\) AppleWebKit)'
4393
4696
  device_replacement: 'Yarvik $1'
4394
4697
  brand_replacement: 'Yarvik'
4395
4698
  model_replacement: '$1'
@@ -4403,7 +4706,7 @@ device_parsers:
4403
4706
  # M778, M7000, M7000AD, M7000NBD, M7001, M7002, M7002KBD, M777, M767,
4404
4707
  # M789, M799, M769, M757, M755, M753, M752, M739, M729, M723, M712, M727
4405
4708
  #########
4406
- - regex: '; *([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4709
+ - regex: '; {0,2}([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4407
4710
  device_replacement: 'Yifang $1$2$3'
4408
4711
  brand_replacement: 'Yifang'
4409
4712
  model_replacement: '$2'
@@ -4412,19 +4715,19 @@ device_parsers:
4412
4715
  # XiaoMi
4413
4716
  # @ref: http://www.xiaomi.com/event/buyphone
4414
4717
  #########
4415
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4718
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4416
4719
  device_replacement: 'XiaoMi $1'
4417
4720
  brand_replacement: 'XiaoMi'
4418
4721
  model_replacement: '$1'
4419
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4722
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4420
4723
  device_replacement: 'XiaoMi $1'
4421
4724
  brand_replacement: 'XiaoMi'
4422
4725
  model_replacement: '$1'
4423
- - regex: '; *(MIX) (Build|MIUI)/'
4726
+ - regex: '; {0,2}(MIX) (Build|MIUI)/'
4424
4727
  device_replacement: 'XiaoMi $1'
4425
4728
  brand_replacement: 'XiaoMi'
4426
4729
  model_replacement: '$1'
4427
- - regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
4730
+ - regex: '; {0,2}((MIX) ([^;/]*)) (Build|MIUI)/'
4428
4731
  device_replacement: 'XiaoMi $1'
4429
4732
  brand_replacement: 'XiaoMi'
4430
4733
  model_replacement: '$1'
@@ -4433,17 +4736,17 @@ device_parsers:
4433
4736
  # Xolo
4434
4737
  # @ref: http://www.xolo.in/
4435
4738
  #########
4436
- - regex: '; *XOLO[ _]([^;/]*tab.*) Build'
4739
+ - regex: '; {0,2}XOLO[ _]([^;/]{0,30}tab.{0,30})(?: Build|\) AppleWebKit)'
4437
4740
  regex_flag: 'i'
4438
4741
  device_replacement: 'Xolo $1'
4439
4742
  brand_replacement: 'Xolo'
4440
4743
  model_replacement: '$1'
4441
- - regex: '; *XOLO[ _]([^;/]+) Build'
4744
+ - regex: '; {0,2}XOLO[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4442
4745
  regex_flag: 'i'
4443
4746
  device_replacement: 'Xolo $1'
4444
4747
  brand_replacement: 'Xolo'
4445
4748
  model_replacement: '$1'
4446
- - regex: '; *(q\d0{2,3}[a-z]?) Build'
4749
+ - regex: '; {0,2}(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4447
4750
  regex_flag: 'i'
4448
4751
  device_replacement: 'Xolo $1'
4449
4752
  brand_replacement: 'Xolo'
@@ -4453,7 +4756,7 @@ device_parsers:
4453
4756
  # Xoro
4454
4757
  # @ref: http://www.xoro.de/produkte/
4455
4758
  #########
4456
- - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/]) Build'
4759
+ - regex: '; {0,2}(PAD ?[79]\d+[^;/]{0,50}|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4457
4760
  device_replacement: 'Xoro $1'
4458
4761
  brand_replacement: 'Xoro'
4459
4762
  model_replacement: '$1'
@@ -4462,7 +4765,7 @@ device_parsers:
4462
4765
  # Zopo
4463
4766
  # @ref: http://www.zopomobiles.com/products.html
4464
4767
  #########
4465
- - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379])) Build'
4768
+ - regex: '; {0,2}(?:(?:ZOPO|Zopo)[ _]([^;/]{1,100}?)|(ZP ?(?:\d{2}[^;/]{1,100}|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4466
4769
  device_replacement: '$1$2$3'
4467
4770
  brand_replacement: 'Zopo'
4468
4771
  model_replacement: '$1$2$3'
@@ -4471,11 +4774,11 @@ device_parsers:
4471
4774
  # ZiiLabs
4472
4775
  # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
4473
4776
  #########
4474
- - regex: '; *(ZiiLABS) (Zii[^;/]*) Build'
4777
+ - regex: '; {0,2}(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4475
4778
  device_replacement: '$1 $2'
4476
4779
  brand_replacement: 'ZiiLabs'
4477
4780
  model_replacement: '$2'
4478
- - regex: '; *(Zii)_([^;/]*) Build'
4781
+ - regex: '; {0,2}(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4479
4782
  device_replacement: '$1 $2'
4480
4783
  brand_replacement: 'ZiiLabs'
4481
4784
  model_replacement: '$2'
@@ -4484,45 +4787,45 @@ device_parsers:
4484
4787
  # ZTE
4485
4788
  # @ref: http://www.ztedevices.com/
4486
4789
  #########
4487
- - 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'
4790
+ - regex: '; {0,2}(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]{0,200}?|Era|Memo[^;]{0,200}?)|JOE|(?:Kis|KIS)\b[^;]{0,200}?|Libra|Light [^;]{0,200}?|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]{0,200}?|RacerII|RACERII|San Francisco[^;]{0,200}?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\) AppleWebKit)'
4488
4791
  device_replacement: '$1'
4489
4792
  brand_replacement: 'ZTE'
4490
4793
  model_replacement: '$1'
4491
- - regex: '; *([A-Z]\d+)_USA_[^;]* Build'
4794
+ - regex: '; {0,2}([A-Z]\d+)_USA_[^;]{0,200}(?: Build|\) AppleWebKit)'
4492
4795
  device_replacement: '$1'
4493
4796
  brand_replacement: 'ZTE'
4494
4797
  model_replacement: '$1'
4495
- - regex: '; *(SmartTab\d+)[^;]* Build'
4798
+ - regex: '; {0,2}(SmartTab\d+)[^;]{0,50}(?: Build|\) AppleWebKit)'
4496
4799
  device_replacement: '$1'
4497
4800
  brand_replacement: 'ZTE'
4498
4801
  model_replacement: '$1'
4499
- - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*) Build'
4802
+ - regex: '; {0,2}(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4500
4803
  device_replacement: 'ZTE Blade$1'
4501
4804
  brand_replacement: 'ZTE'
4502
4805
  model_replacement: 'Blade$1'
4503
- - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*) Build'
4806
+ - regex: '; {0,2}(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4504
4807
  device_replacement: 'ZTE Skate$1'
4505
4808
  brand_replacement: 'ZTE'
4506
4809
  model_replacement: 'Skate$1'
4507
- - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco) Build'
4810
+ - regex: '; {0,2}(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4508
4811
  device_replacement: '$1$2'
4509
4812
  brand_replacement: 'ZTE'
4510
4813
  model_replacement: '$1$2'
4511
- - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+) Build'
4814
+ - regex: '; {0,2}(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4512
4815
  device_replacement: 'ZTE $1'
4513
4816
  brand_replacement: 'ZTE'
4514
4817
  model_replacement: '$1'
4515
4818
  # operator specific
4516
- - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*) Build'
4819
+ - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]{0,200}?)(?: Build|\) AppleWebKit)'
4517
4820
  device_replacement: '$1 $2'
4518
4821
  brand_replacement: 'ZTE'
4519
4822
  model_replacement: '$1 $2'
4520
- - regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link) Build'
4823
+ - regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link)(?: Build|\) AppleWebKit)'
4521
4824
  regex_flag: 'i'
4522
4825
  device_replacement: '$1'
4523
4826
  brand_replacement: 'ZTE'
4524
4827
  model_replacement: '$1'
4525
- - regex: '; *(vp9plus)\)'
4828
+ - regex: '; {0,2}(vp9plus)\)'
4526
4829
  device_replacement: '$1'
4527
4830
  brand_replacement: 'ZTE'
4528
4831
  model_replacement: '$1'
@@ -4531,7 +4834,7 @@ device_parsers:
4531
4834
  # Zync
4532
4835
  # @ref: http://www.zync.in/index.php/our-products/tablet-phablets
4533
4836
  ##########
4534
- - regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900) Build/'
4837
+ - regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900)(?: Build|\) AppleWebKit)'
4535
4838
  device_replacement: '$1'
4536
4839
  brand_replacement: 'Zync'
4537
4840
  model_replacement: '$1'
@@ -4582,7 +4885,7 @@ device_parsers:
4582
4885
  device_replacement: 'Kindle Fire HDX 8.9" 4G'
4583
4886
  brand_replacement: 'Amazon'
4584
4887
  model_replacement: 'Kindle Fire HDX 8.9" 4G'
4585
- - regex: '; ?Amazon ([^;/]+) Build\b'
4888
+ - regex: '; ?Amazon ([^;/]{1,100}) Build\b'
4586
4889
  device_replacement: '$1'
4587
4890
  brand_replacement: 'Amazon'
4588
4891
  model_replacement: '$1'
@@ -4605,22 +4908,22 @@ device_parsers:
4605
4908
 
4606
4909
  #########
4607
4910
  # Devices from chinese manufacturer(s)
4608
- # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.*
4911
+ # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.{0,200}
4609
4912
  #########
4610
- - regex: '(sprd)\-([^/]+)/'
4913
+ - regex: '(sprd)\-([^/]{1,50})/'
4611
4914
  device_replacement: '$1 $2'
4612
4915
  brand_replacement: '$1'
4613
4916
  model_replacement: '$2'
4614
4917
  # @ref: http://eshinechina.en.alibaba.com/
4615
- - regex: '; *(H\d{2}00\+?) Build'
4918
+ - regex: '; {0,2}(H\d{2}00\+?) Build'
4616
4919
  device_replacement: '$1'
4617
4920
  brand_replacement: 'Hero'
4618
4921
  model_replacement: '$1'
4619
- - regex: '; *(iphone|iPhone5) Build/'
4922
+ - regex: '; {0,2}(iphone|iPhone5) Build/'
4620
4923
  device_replacement: 'Xianghe $1'
4621
4924
  brand_replacement: 'Xianghe'
4622
4925
  model_replacement: '$1'
4623
- - regex: '; *(e\d{4}[a-z]?_?v\d+|v89_[^;/]+)[^;/]+ Build/'
4926
+ - regex: '; {0,2}(e\d{4}[a-z]?_?v\d+|v89_[^;/]{1,100})[^;/]{1,30} Build/'
4624
4927
  device_replacement: 'Xianghe $1'
4625
4928
  brand_replacement: 'Xianghe'
4626
4929
  model_replacement: '$1'
@@ -4642,7 +4945,7 @@ device_parsers:
4642
4945
  #########
4643
4946
  # Alcatel Windows Phones
4644
4947
  #########
4645
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
4948
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]{0,200}; {0,2}([^;,\)]+)'
4646
4949
  device_replacement: 'Alcatel $1'
4647
4950
  brand_replacement: 'Alcatel'
4648
4951
  model_replacement: '$1'
@@ -4650,8 +4953,7 @@ device_parsers:
4650
4953
  #########
4651
4954
  # Asus Windows Phones
4652
4955
  #########
4653
- #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4654
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4956
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]{0,200}; {0,2}([^;,\)]+)'
4655
4957
  device_replacement: 'Asus $1'
4656
4958
  brand_replacement: 'Asus'
4657
4959
  model_replacement: '$1'
@@ -4659,7 +4961,7 @@ device_parsers:
4659
4961
  #########
4660
4962
  # Dell Windows Phones
4661
4963
  #########
4662
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
4964
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]{0,200}; {0,2}([^;,\)]+)'
4663
4965
  device_replacement: 'Dell $1'
4664
4966
  brand_replacement: 'Dell'
4665
4967
  model_replacement: '$1'
@@ -4667,7 +4969,7 @@ device_parsers:
4667
4969
  #########
4668
4970
  # HTC Windows Phones
4669
4971
  #########
4670
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)'
4972
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]{0,200})[^;]{0,200}; {0,2}(?:HTC|)([^;,\)]+)'
4671
4973
  device_replacement: 'HTC $1'
4672
4974
  brand_replacement: 'HTC'
4673
4975
  model_replacement: '$1'
@@ -4675,7 +4977,7 @@ device_parsers:
4675
4977
  #########
4676
4978
  # Huawei Windows Phones
4677
4979
  #########
4678
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
4980
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]{0,200}; {0,2}(?:HUAWEI |)([^;,\)]+)'
4679
4981
  device_replacement: 'Huawei $1'
4680
4982
  brand_replacement: 'Huawei'
4681
4983
  model_replacement: '$1'
@@ -4683,7 +4985,7 @@ device_parsers:
4683
4985
  #########
4684
4986
  # LG Windows Phones
4685
4987
  #########
4686
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
4988
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]{0,200}; {0,2}(?:LG[ \-]|)([^;,\)]+)'
4687
4989
  device_replacement: 'LG $1'
4688
4990
  brand_replacement: 'LG'
4689
4991
  model_replacement: '$1'
@@ -4691,15 +4993,15 @@ device_parsers:
4691
4993
  #########
4692
4994
  # Noka Windows Phones
4693
4995
  #########
4694
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
4996
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
4695
4997
  device_replacement: 'Lumia $1'
4696
4998
  brand_replacement: 'Nokia'
4697
4999
  model_replacement: 'Lumia $1'
4698
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
5000
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(RM-\d{3,})'
4699
5001
  device_replacement: 'Nokia $1'
4700
5002
  brand_replacement: 'Nokia'
4701
5003
  model_replacement: '$1'
4702
- - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
5004
+ - regex: '(?:Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
4703
5005
  device_replacement: 'Nokia $1'
4704
5006
  brand_replacement: 'Nokia'
4705
5007
  model_replacement: '$1'
@@ -4707,7 +5009,7 @@ device_parsers:
4707
5009
  #########
4708
5010
  # Microsoft Windows Phones
4709
5011
  #########
4710
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
5012
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]{0,200}; {0,2}([^;,\)]+)'
4711
5013
  device_replacement: 'Microsoft $1'
4712
5014
  brand_replacement: 'Microsoft'
4713
5015
  model_replacement: '$1'
@@ -4715,7 +5017,7 @@ device_parsers:
4715
5017
  #########
4716
5018
  # Samsung Windows Phones
4717
5019
  #########
4718
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
5020
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]{0,200}; {0,2}(?:SAMSUNG |)([^;,\.\)]+)'
4719
5021
  device_replacement: 'Samsung $1'
4720
5022
  brand_replacement: 'Samsung'
4721
5023
  model_replacement: '$1'
@@ -4723,7 +5025,7 @@ device_parsers:
4723
5025
  #########
4724
5026
  # Toshiba Windows Phones
4725
5027
  #########
4726
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
5028
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]{0,200}; {0,2}([^;,\)]+)'
4727
5029
  device_replacement: 'Toshiba $1'
4728
5030
  brand_replacement: 'Toshiba'
4729
5031
  model_replacement: '$1'
@@ -4731,7 +5033,7 @@ device_parsers:
4731
5033
  #########
4732
5034
  # Generic Windows Phones
4733
5035
  #########
4734
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
5036
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]{1,200}); {0,2}([^;,\)]+)'
4735
5037
  device_replacement: '$1 $2'
4736
5038
  brand_replacement: '$1'
4737
5039
  model_replacement: '$2'
@@ -4743,7 +5045,7 @@ device_parsers:
4743
5045
  #########
4744
5046
  # Samsung Bada Phones
4745
5047
  #########
4746
- - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]+).* Bada/'
5048
+ - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]{1,50}).{0,200} Bada/'
4747
5049
  device_replacement: 'Samsung $1'
4748
5050
  brand_replacement: 'Samsung'
4749
5051
  model_replacement: '$1'
@@ -4751,24 +5053,40 @@ device_parsers:
4751
5053
  #########
4752
5054
  # Firefox OS
4753
5055
  #########
4754
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5056
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]{1,100}?)(?:/[^;]{1,200}|); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4755
5057
  device_replacement: 'Alcatel $1 $2 $3'
4756
5058
  brand_replacement: 'Alcatel'
4757
5059
  model_replacement: 'One Touch $3'
4758
- - regex: '\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5060
+ - regex: '\(Mobile; (?:ZTE([^;]{1,200})|(OpenC)); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4759
5061
  device_replacement: 'ZTE $1$2'
4760
5062
  brand_replacement: 'ZTE'
4761
5063
  model_replacement: '$1$2'
4762
5064
 
5065
+ #########
5066
+ # KaiOS
5067
+ #########
5068
+ - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/[^\/]{1,200} KaiOS/'
5069
+ device_replacement: 'Alcatel $1'
5070
+ brand_replacement: 'Alcatel'
5071
+ model_replacement: '$1'
5072
+ - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]{1,100})\/.{0,100};.{0,100}rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
5073
+ device_replacement: 'LYF $1'
5074
+ brand_replacement: 'LYF'
5075
+ model_replacement: '$1'
5076
+ - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]{1,100})_.{1,100}; rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
5077
+ device_replacement: 'Nokia $1'
5078
+ brand_replacement: 'Nokia'
5079
+ model_replacement: '$1'
5080
+
4763
5081
  ##########
4764
5082
  # NOKIA
4765
5083
  # @note: NokiaN8-00 comes before iphone. Sometimes spoofs iphone
4766
5084
  ##########
4767
- - regex: 'Nokia(N[0-9]+)([A-z_\-][A-z0-9_\-]*)'
5085
+ - regex: 'Nokia(N[0-9]+)([A-Za-z_\-][A-Za-z0-9_\-]*)'
4768
5086
  device_replacement: 'Nokia $1'
4769
5087
  brand_replacement: 'Nokia'
4770
5088
  model_replacement: '$1$2'
4771
- - regex: '(?:NOKIA|Nokia)(?:\-| *)(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
5089
+ - regex: '(?:NOKIA|Nokia)(?:\-| {0,2})(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
4772
5090
  device_replacement: 'Nokia $1$2$3'
4773
5091
  brand_replacement: 'Nokia'
4774
5092
  model_replacement: '$1$2$3'
@@ -4777,12 +5095,12 @@ device_parsers:
4777
5095
  brand_replacement: 'Nokia'
4778
5096
  model_replacement: 'Lumia $1'
4779
5097
  # UCWEB Browser on Symbian
4780
- - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+)\)'
5098
+ - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]{1,100}?)\)'
4781
5099
  device_replacement: '$1 $2'
4782
5100
  brand_replacement: '$1'
4783
5101
  model_replacement: '$2'
4784
5102
  # Nokia Symbian
4785
- - regex: '\(Symbian(?:/3|); U; ([^;]+);'
5103
+ - regex: '\(Symbian(?:/3|); U; ([^;]{1,200});'
4786
5104
  device_replacement: 'Nokia $1'
4787
5105
  brand_replacement: 'Nokia'
4788
5106
  model_replacement: '$1'
@@ -4795,7 +5113,7 @@ device_parsers:
4795
5113
  device_replacement: 'BlackBerry $1'
4796
5114
  brand_replacement: 'BlackBerry'
4797
5115
  model_replacement: '$1'
4798
- - regex: 'Play[Bb]ook.+RIM Tablet OS'
5116
+ - regex: 'Play[Bb]ook.{1,200}RIM Tablet OS'
4799
5117
  device_replacement: 'BlackBerry Playbook'
4800
5118
  brand_replacement: 'BlackBerry'
4801
5119
  model_replacement: 'Playbook'
@@ -4827,7 +5145,7 @@ device_parsers:
4827
5145
  device_replacement: 'Palm Treo $1'
4828
5146
  brand_replacement: 'Palm'
4829
5147
  model_replacement: 'Treo $1'
4830
- - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
5148
+ - regex: 'webOS.{0,200}(P160U(?:NA|))/(\d+).(\d+)'
4831
5149
  device_replacement: 'HP Veer'
4832
5150
  brand_replacement: 'HP'
4833
5151
  model_replacement: 'Veer'
@@ -4835,7 +5153,7 @@ device_parsers:
4835
5153
  device_replacement: 'HP TouchPad'
4836
5154
  brand_replacement: 'HP'
4837
5155
  model_replacement: 'TouchPad'
4838
- - regex: 'HPiPAQ([A-Za-z0-9]+)/\d+.\d+'
5156
+ - regex: 'HPiPAQ([A-Za-z0-9]{1,20})/\d+\.\d+'
4839
5157
  device_replacement: 'HP iPAQ $1'
4840
5158
  brand_replacement: 'HP'
4841
5159
  model_replacement: 'iPAQ $1'
@@ -4889,7 +5207,7 @@ device_parsers:
4889
5207
  - regex: '(Watch)(\d+,\d+)'
4890
5208
  device_replacement: 'Apple $1'
4891
5209
  brand_replacement: 'Apple'
4892
- model_replacement: 'Apple $1 $2'
5210
+ model_replacement: '$1$2'
4893
5211
  - regex: '(Apple Watch)(?:;| Simulator;)'
4894
5212
  device_replacement: '$1'
4895
5213
  brand_replacement: 'Apple'
@@ -4903,18 +5221,18 @@ device_parsers:
4903
5221
  brand_replacement: 'Apple'
4904
5222
  model_replacement: 'iPhone'
4905
5223
  # @note: desktop applications show device info
4906
- - regex: 'CFNetwork/.* Darwin/\d.*\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
5224
+ - regex: 'CFNetwork/.{0,100} Darwin/\d.{0,100}\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
4907
5225
  device_replacement: '$1$2,$3'
4908
5226
  brand_replacement: 'Apple'
4909
5227
  model_replacement: '$1$2,$3'
4910
5228
  # @note: newer desktop applications don't show device info
4911
5229
  # This is here so as to not have them recorded as iOS-Device
4912
- - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5230
+ - regex: 'CFNetwork/.{0,100} Darwin/\d+\.\d+\.\d+ \(x86_64\)'
4913
5231
  device_replacement: 'Mac'
4914
5232
  brand_replacement: 'Apple'
4915
5233
  model_replacement: 'Mac'
4916
5234
  # @note: iOS applications do not show device info
4917
- - regex: 'CFNetwork/.* Darwin/\d'
5235
+ - regex: 'CFNetwork/.{0,100} Darwin/\d'
4918
5236
  device_replacement: 'iOS-Device'
4919
5237
  brand_replacement: 'Apple'
4920
5238
  model_replacement: 'iOS-Device'
@@ -4958,7 +5276,7 @@ device_parsers:
4958
5276
  device_replacement: 'Asus $1'
4959
5277
  brand_replacement: 'Asus'
4960
5278
  model_replacement: '$1'
4961
- - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5279
+ - regex: '(?:asus.{0,200}?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
4962
5280
  device_replacement: 'Asus $1'
4963
5281
  brand_replacement: 'Asus'
4964
5282
  model_replacement: '$1'
@@ -4991,11 +5309,11 @@ device_parsers:
4991
5309
  device_replacement: 'DoCoMo $1'
4992
5310
  brand_replacement: 'DoCoMo'
4993
5311
  model_replacement: '$1'
4994
- - regex: '([A-Za-z0-9]+)_W;FOMA'
5312
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30})_W;FOMA'
4995
5313
  device_replacement: 'DoCoMo $1'
4996
5314
  brand_replacement: 'DoCoMo'
4997
5315
  model_replacement: '$1'
4998
- - regex: '([A-Za-z0-9]+);FOMA'
5316
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30});FOMA'
4999
5317
  device_replacement: 'DoCoMo $1'
5000
5318
  brand_replacement: 'DoCoMo'
5001
5319
  model_replacement: '$1'
@@ -5003,7 +5321,7 @@ device_parsers:
5003
5321
  ##########
5004
5322
  # htc
5005
5323
  ##########
5006
- - regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5324
+ - regex: '\b(?:HTC/|HTC/[a-z0-9]{1,20}/|)HTC[ _\-;]? {0,2}(.{0,200}?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5007
5325
  device_replacement: 'HTC $1'
5008
5326
  brand_replacement: 'HTC'
5009
5327
  model_replacement: '$1'
@@ -5060,22 +5378,22 @@ device_parsers:
5060
5378
  # HbbTV (European and Australian standard)
5061
5379
  # written before the LG regexes, as LG is making HbbTV too
5062
5380
  ##########
5063
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]*; *(LG)E *; *([^;]*) *;[^;]*;[^;]*;\)'
5381
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \( ?;(LG)E ?;([^;]{0,30})'
5064
5382
  device_replacement: '$1'
5065
5383
  brand_replacement: '$2'
5066
5384
  model_replacement: '$3'
5067
- - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
5385
+ - regex: '(HbbTV)/1\.1\.1.{0,200}CE-HTML/1\.\d;(Vendor/|)(THOM[^;]{0,200}?)[;\s].{0,30}(LF[^;]{1,200});?'
5068
5386
  device_replacement: '$1'
5069
5387
  brand_replacement: 'Thomson'
5070
5388
  model_replacement: '$4'
5071
- - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);'
5389
+ - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); {0,2}CE-HTML(?:/1\.\d|); {0,2}([^ ]{1,30}) ([^;]{1,200});'
5072
5390
  device_replacement: '$1'
5073
5391
  brand_replacement: '$2'
5074
5392
  model_replacement: '$3'
5075
5393
  - regex: '(HbbTV)/1\.1\.1 \(;;;;;\) Maple_2011'
5076
5394
  device_replacement: '$1'
5077
5395
  brand_replacement: 'Samsung'
5078
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]*; *(?:CUS:([^;]*)|([^;]+)) *; *([^;]*) *;.*;'
5396
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]{0,200})|([^;]{1,200})) ?; ?([^;]{0,30})'
5079
5397
  device_replacement: '$1'
5080
5398
  brand_replacement: '$2$3'
5081
5399
  model_replacement: '$4'
@@ -5085,7 +5403,7 @@ device_parsers:
5085
5403
  ##########
5086
5404
  # LGE NetCast TV
5087
5405
  ##########
5088
- - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5406
+ - regex: 'LGE; (?:Media\/|)([^;]{0,200});[^;]{0,200};[^;]{0,200};?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5089
5407
  device_replacement: 'NetCast$2'
5090
5408
  brand_replacement: 'LG'
5091
5409
  model_replacement: '$1'
@@ -5093,11 +5411,11 @@ device_parsers:
5093
5411
  ##########
5094
5412
  # InettvBrowser
5095
5413
  ##########
5096
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;(Sony)([^;]*);[^;]*;[^\)]*\)'
5414
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};(Sony)([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5097
5415
  device_replacement: 'Inettv'
5098
5416
  brand_replacement: '$1'
5099
5417
  model_replacement: '$2'
5100
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;([^;]*);[^;]*;[^\)]*\)'
5418
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5101
5419
  device_replacement: 'Inettv'
5102
5420
  brand_replacement: 'Generic_Inettv'
5103
5421
  model_replacement: '$1'
@@ -5134,7 +5452,7 @@ device_parsers:
5134
5452
  device_replacement: 'Microsoft $1'
5135
5453
  brand_replacement: 'Microsoft'
5136
5454
  model_replacement: '$1'
5137
- - regex: '(?:MSIE|XBMC).*\b(Xbox)\b'
5455
+ - regex: '(?:MSIE|XBMC).{0,200}\b(Xbox)\b'
5138
5456
  device_replacement: '$1'
5139
5457
  brand_replacement: 'Microsoft'
5140
5458
  model_replacement: '$1'
@@ -5195,12 +5513,12 @@ device_parsers:
5195
5513
  # Samsung
5196
5514
  ##########
5197
5515
  # Samsung Smart-TV
5198
- - regex: '(SMART-TV); .* Tizen '
5516
+ - regex: '(SMART-TV); .{0,200} Tizen '
5199
5517
  device_replacement: 'Samsung $1'
5200
5518
  brand_replacement: 'Samsung'
5201
5519
  model_replacement: '$1'
5202
5520
  # Samsung Symbian Devices
5203
- - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
5521
+ - regex: 'SymbianOS/9\.\d.{0,200} Samsung[/\-]([A-Za-z0-9 \-]+)'
5204
5522
  device_replacement: 'Samsung $1'
5205
5523
  brand_replacement: 'Samsung'
5206
5524
  model_replacement: '$1'
@@ -5208,7 +5526,7 @@ device_parsers:
5208
5526
  device_replacement: '$1 $2$3'
5209
5527
  brand_replacement: '$1'
5210
5528
  model_replacement: '$2-$3'
5211
- - regex: 'SAMSUNG-ANDROID-MMS/([^;/]+)'
5529
+ - regex: 'SAMSUNG-ANDROID-MMS/([^;/]{1,100})'
5212
5530
  device_replacement: '$1'
5213
5531
  brand_replacement: 'Samsung'
5214
5532
  model_replacement: '$1'
@@ -5255,7 +5573,7 @@ device_parsers:
5255
5573
  ##########
5256
5574
  # Sony
5257
5575
  ##########
5258
- - regex: 'Android [^;]+; ([^ ]+) (Sony)/'
5576
+ - regex: 'Android [^;]{1,200}; ([^ ]+) (Sony)/'
5259
5577
  device_replacement: '$2 $1'
5260
5578
  brand_replacement: '$2'
5261
5579
  model_replacement: '$1'
@@ -5289,27 +5607,33 @@ device_parsers:
5289
5607
  #########
5290
5608
  # Android General Device Matching (far from perfect)
5291
5609
  #########
5292
- - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))'
5610
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.{1,200})( Build[/ ]|\))'
5293
5611
  brand_replacement: 'Generic_Android'
5294
5612
  model_replacement: '$1'
5295
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))'
5613
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5296
5614
  brand_replacement: 'Generic_Android'
5297
5615
  model_replacement: '$1'
5298
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))'
5616
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5299
5617
  brand_replacement: 'Generic_Android'
5300
5618
  model_replacement: '$1'
5301
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))'
5619
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{0,2}\- {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5302
5620
  brand_replacement: 'Generic_Android'
5303
5621
  model_replacement: '$1'
5304
5622
  # No build info at all - "Build" follows locale immediately
5305
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5623
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5306
5624
  device_replacement: 'Generic Smartphone'
5307
5625
  brand_replacement: 'Generic'
5308
5626
  model_replacement: 'Smartphone'
5309
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
5627
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,3}\-?[A-Za-z]{2}; {0,2}(.{1,50}?)( Build[/ ]|\))'
5310
5628
  brand_replacement: 'Generic_Android'
5311
5629
  model_replacement: '$1'
5312
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|)(?:;.*|); *(.+?)( Build[/ ]|\))'
5630
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Mobile Safari'
5631
+ brand_replacement: 'Generic_Android'
5632
+ model_replacement: '$1'
5633
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Safari'
5634
+ brand_replacement: 'Generic_Android_Tablet'
5635
+ model_replacement: '$1'
5636
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\))'
5313
5637
  brand_replacement: 'Generic_Android'
5314
5638
  model_replacement: '$1'
5315
5639
 
@@ -5334,7 +5658,7 @@ device_parsers:
5334
5658
  ##########
5335
5659
  # Generic Tablet
5336
5660
  ##########
5337
- - regex: '(Android 3\.\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))'
5661
+ - regex: '(Android 3\.\d|Opera Tablet|Tablet; .{1,100}Firefox/|Android.{0,100}(?:Tab|Pad))'
5338
5662
  regex_flag: 'i'
5339
5663
  device_replacement: 'Generic Tablet'
5340
5664
  brand_replacement: 'Generic'
@@ -5343,7 +5667,7 @@ device_parsers:
5343
5667
  ##########
5344
5668
  # Generic Smart Phone
5345
5669
  ##########
5346
- - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .+Firefox/|iPhone OS|Android|MobileSafari|Windows *Phone|\(webOS/|PalmOS)'
5670
+ - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .{1,200}Firefox/|iPhone OS|Android|MobileSafari|Windows {0,2}Phone|\(webOS/|PalmOS)'
5347
5671
  device_replacement: 'Generic Smartphone'
5348
5672
  brand_replacement: 'Generic'
5349
5673
  model_replacement: 'Smartphone'
@@ -5354,9 +5678,9 @@ device_parsers:
5354
5678
  model_replacement: 'Smartphone'
5355
5679
 
5356
5680
  ##########
5357
- # Spiders (this is hack...)
5681
+ # Spiders (this is a hack...)
5358
5682
  ##########
5359
- - 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)'
5683
+ - regex: '^.{0,100}(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.{0,200}/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)'
5360
5684
  regex_flag: 'i'
5361
5685
  device_replacement: 'Spider'
5362
5686
  brand_replacement: 'Spider'
@@ -5395,3 +5719,14 @@ device_parsers:
5395
5719
  device_replacement: 'Generic Feature Phone'
5396
5720
  brand_replacement: 'Generic'
5397
5721
  model_replacement: 'Feature Phone'
5722
+
5723
+ #########
5724
+ # Apple
5725
+ # @ref: https://www.apple.com/mac/
5726
+ # @note: lookup Mac OS, but exclude iPad, Apple TV, a HTC phone, Kindle, LG
5727
+ # @note: put this at the end, since it is hard to implement contains foo, but not contain bar1, bar 2, bar 3 in go's re2
5728
+ #########
5729
+ - regex: 'Mac OS'
5730
+ device_replacement: 'Mac'
5731
+ brand_replacement: 'Apple'
5732
+ model_replacement: 'Mac'