Home > front end >  How to split string by Regex matching in JavaScript
How to split string by Regex matching in JavaScript

Time:12-18

I am already trying for over an hour and cant figure out the right way to do it. I have this Regex:

const search = /("Response)\s \d \s (of)\s \d (":)\s /g;

I have this string:

{"Response 1 of 2": {"Name": "Jouny", "Class": "TR23", "Message Type": "Offer", "ID Identifier": "19256", "Address": "hjfhfgjhjhj"}, "Response 2 of 2": {"Name": "Sarah", "Class": "BHT56", "Message Type": "Alarm", "ID Identifier": "89756767", "Address": "oplkdhdggd"}}

I would like to have a result like this:

[
   {"Name": "Jouny", "Class": "TR23", "Message Type": "Offer", "ID Identifier": "19256", 
        "Address": "hjfhfgjhjhj"},
   {"Name": "Sarah", "Class": "BHT56", "Message Type": "Alarm", "ID Identifier": "89756767", 
        "Address": "oplkdhdggd"}
 ]

my code:

var lines = results.toString().split(/\n/);
lines.forEach(function (item) {
    if (item.indexOf(myData) > 0) {
        var json = item.slice(item.indexOf(script)   script.length   2).replace(PRINTABLE_CHAR, '');
        var jsonMatch = json.split(json.match(search));
        var result = jsonMatch.substr(0, jsonMatch.lastIndexOf('}')).replace(PRINTABLE_CHAR, '');
        try {
                data = JSON.parse(result);
            } catch (e) {
                console.log('ERROR');
            }
    
        }
    });

CodePudding user response:

You can achieve the same result using Object.values

const initialObject = {"Response 1 of 2": {"Name": "Jouny", "Class": "TR23", "Message Type": "Offer", "ID Identifier": "19256", "Address": "hjfhfgjhjhj"}, "Response 2 of 2": {"Name": "Sarah", "Class": "BHT56", "Message Type": "Alarm", "ID Identifier": "89756767", "Address": "oplkdhdggd"}}


const resultObject = Object.values(initialObject);

console.log(resultObject);

CodePudding user response:

This issue can be solved without regex. You can parse the first string as JSON using JSON.parse(string), then you can get the list of keys using Object.keys(json) and then do a forEach and push it to a list, which will get you what you want without having to deal with regex. I will show the code below

let string = '{"Response 1 of 2": {"Name": "Jouny", "Class": "TR23", "Message Type": "Offer", "ID Identifier": "19256", "Address": "hjfhfgjhjhj"}, "Response 2 of 2": {"Name": "Sarah", "Class": "BHT56", "Message Type": "Alarm", "ID Identifier": "89756767", "Address": "oplkdhdggd"}}'
let list = [] //this will be the list that we will return at the end
let data = JSON.parse(string) //parse the data into json

Object.keys(data).forEach(key => list.push(data[key])) //get the keys and iterate through it
return list //return the list

This should be a much better alternative to using regex. Regex was not made for what you are trying to do.

EDIT: Ah, follow @callback 's advice. Using object.values() would be a much better solution.

  • Related