Greetings, I can not write a regular list to break the string into the required data.
There is a list of skins:

★ Falchion Knife | Boreal Forest (Factory New) Souvenir FAMAS | Teardown (Battle-Scarred) ★ StatTrak™ Flip Knife | Lore (Field-Tested) ★ Bayonet | Autotronic (Battle-Scarred) AK-47 | Redline (Field-Tested) ★ Karambit | Bright Water (Battle-Scarred) StatTrak™ Negev | Man-o'-war (Minimal Wear) ★ M9 Bayonet | Marble Fade (Minimal Wear) ★ StatTrak™ Flip Knife | Gamma Doppler (Minimal Wear) Tec-9 | Nuclear Threat (Factory New) Souvenir Tec-9 | Nuclear Threat (Minimal Wear) ★ StatTrak™ Karambit ★ StatTrak™ Gut Knife ★ Huntsman Knife 

Add. information:
★ - means it is a knife
StatTrak ™ - skin has a shot count
Souvenir - souvenir skin
(Minimal Wear) - quality skin
AK-47 | Redline - skin name

It is necessary to output data using a regular expression such as:
1. Is the skin souvenir
2. Is it a knife?
3. Does the meter have
4. skin name
5. if available, quality

I attached explanatory materials: https://jsfiddle.net/zn6Lk233/3/

  • You do not need to use regular expressions for your task. HTML markup is present on JSFiddle, do you need to parse it? Or are the strings text? - XelaNimed Nov.
  • @XelaNimed with the text, I added all the examples that should fit the same regular expression into an array. HTML to better understand which part of the line is called. - Vladislav Siroshtan Nov.
  • I am not sure that one regular program will answer 5 questions at once. For everyone to make a regular season - then maybe - daydark Nov.

2 answers 2

If it is not necessary to use regular expressions, you can do this as follows:

 var weapons = [ '★ Falchion Knife | Boreal Forest (Factory New)', 'Souvenir FAMAS | Teardown (Battle-Scarred)', '★ StatTrak™ Flip Knife | Lore (Field-Tested)', '★ Bayonet | Autotronic (Battle-Scarred)', 'AK-47 | Redline (Field-Tested)', '★ Karambit | Bright Water (Battle-Scarred)', 'StatTrak™ Negev | Man-o\'-war (Minimal Wear)', '★ M9 Bayonet | Marble Fade (Minimal Wear)', '★ StatTrak™ Flip Knife | Gamma Doppler (Minimal Wear)', 'Tec-9 | Nuclear Threat (Factory New)', 'Souvenir Tec-9 | Nuclear Threat (Minimal Wear)', '★ StatTrak™ Karambit', '★ StatTrak™ Gut Knife', '★ Huntsman Knife' ]; var weaponString = weapons.join("\n"); function weaponParser(weapons) { this.weapons = weapons; } weaponParser.prototype.getProperties = function() { return [{ name: "означает, что это нож", regex: /★/, prop: "isKnife", saveRegexValue: false }, { name: "скин имеет счетчик выстрелов", regex: /StatTrak™/, prop: "isShoot", saveRegexValue: false }, { name: "сувенирный скин", regex: /Souvenir/, prop: "isSouvenir", saveRegexValue: false }, { name: "качество скина", regex: /\(.*\)/, prop: "quality", saveRegexValue: true }]; } weaponParser.prototype.parse = function() { var lines = this.weapons.split("\n"); var items = this.getProperties(); var result = []; for (var i = 0; i < lines.length; i++) { var line = lines[i]; var weapon = {}; for (var j = 0; j < items.length; j++) { var property = items[j]; if (property.saveRegexValue) weapon[property.prop] = property.regex.exec(line); else weapon[property.prop] = property.regex.test(line); if (weapon[property.prop]) line = line.replace(property.regex, ''); } weapon.name = line; result.push(weapon); } return result; } var parser = new weaponParser(weaponString); var result = parser.parse(); console.log(result); 

An example on jsfiddle .

An example using a regular expression.

 var weapons = [ '★ Falchion Knife | Boreal Forest (Factory New)', '★ Souvenir FAMAS | Teardown (Battle-Scarred)', '★ StatTrak™ Flip Knife | Lore (Field-Tested)', '★ Bayonet | Autotronic (Battle-Scarred)', 'AK-47 | Redline (Field-Tested)', '★ Karambit | Bright Water (Battle-Scarred)', 'StatTrak™ Negev | Man-o\'-war (Minimal Wear)', '★ M9 Bayonet | Marble Fade (Minimal Wear)', '★ StatTrak™ Flip Knife | Gamma Doppler (Minimal Wear)', 'Tec-9 | Nuclear Threat (Factory New)', 'Souvenir Tec-9 | Nuclear Threat (Minimal Wear)', '★ StatTrak™ Karambit', '★ StatTrak™ Gut Knife', '★ Huntsman Knife' ]; var weaponString = weapons.join("\n"); function weaponParserRegex(weapons) { this.weapons = weapons; } weaponParserRegex.prototype.parse = function() { var lines = this.weapons.split("\n"); var regex = /(★)?\s*(StatTrak™)?\s*(Souvenir)?\s*(.*)\s*(\(.*\))*/; var result = []; for (var i = 0; i < lines.length; i++) { var line = lines[i]; line.replace(regex, function(text, knife, starTrack, souvenir, name, quality) { result.push({ knife: !!knife, starTrack: !!starTrack, souvenir: !!souvenir, name: name, quality: quality, text: text }) }) } return result; } var parser = new weaponParserRegex(weaponString); var result = parser.parse(); console.log(result); 

An example on jsfiddle .

  • Both of your examples use regular expressions. What did you mean when you wrote "If it is not necessary to use regular expressions"? - XelaNimed Nov.
  • Sorry, may not correctly put it. As far as I understood, it was necessary to get the values ​​using one regular expression. In the first case, I use 4 regular expressions, not one. And in the second case I use only one regular expression. - Stepan Kasyanenko Nov.

Or you can:

 // skinList is element ID of textarea var lines = $("#skinsList").val().split("\n"), skins = []; lines.forEach(function(item){ var skin = { isSouvenir : false, isKnife : false, hasCounter : false, counterName : null, quality : null, name : null }, line = item; var starPos = line.indexOf("★"); if(starPos != -1){ skin.isKnife = true; line = line.substr(starPos + 2); } var souvenirPos = line.indexOf("Souvenir"); if(souvenirPos != -1){ skin.isSouvenir = true; line = line.substr(souvenirPos + "Souvenir".length + 1); } var bracePos = line.indexOf("("); if(bracePos != -1){ skin.quality = line.substring(bracePos + 1, line.indexOf(")")); line = line.substring(0, bracePos - 1); } if(line.indexOf("™ ") != -1){ var tmp = line.split("™ "); skin.counterName = tmp[0]; skin.hasCounter = true; line = tmp[1]; } skin.name = line; skins.push(skin); }); 

Example parsing without using regular expressions on JSFiddle