Home > Net >  How to apply regular expression for Javascript
How to apply regular expression for Javascript

Time:10-01

I am trying to get message log from Azure application Insight like this

az monitor app-insights --app [app id] --analystics-query [condition like specific message id]

Then I got a message like this

"message": [ "Receiving message: {"type":"CTL","traceId":"f0d11b3dbf27b8fc57ac0e40c4ed9e48","spanId":"a5508acb0926fb1a","id":{"global":"GLkELDUjcRpP4srUt9yngY","caller":null,"local":"GLkELDUisjnGrSK5wKybht"},"eventVersion":"format version","timeStamp":"2021-10-01T14:55:59.8168722 07:00","eventMetadata":{"deleteTimeStamp":null,"ttlSeconds":null,"isFcra":null,"isDppa":true,"isCCPA":true,"globalProductId":null,"globalSubProductId":null,"mbsiProductId":null},"eventBody":{"sys":"otel","msg":"Testing Centralized Event Publisher with App1 (using logback)","app":{"name":"otel","service":"postHouse","status":"status name","method":"POST","protocol":"HTTP","resp_time_ms":"250","status_code":"4"},}}"

] }

So that I would like to apply Regular Expression for this message to get only the message from {"type.....to "status_code":"4"},}} and also convert it to JSON format

I have code like this in my .js file

Then('extract json from {string}', function(message){
    message = getVal(message, this);
    const getmess = message.match(/{(.*)}/g);
    const messJson = JSON.parse(getmess);
    console.log(messJson);
}) 

But it doesn't work for me

SyntaxError: Unexpected token \ in JSON at position 1

How can I apply this in my code on Javascript? Thank you so much for your help

CodePudding user response:

Try this. But keep in mind, that current regex is binded with provided program output syntax. If output will be different in wrapper structure, this regex might not work any more.

// Text from app
const STDOUT = `
    "message": [ "Receiving message: {"type":"CTL","traceId":"f0d11b3dbf27b8fc57ac0e40c4ed9e48","spanId":"a5508acb0926fb1a","id":{"global":"GLkELDUjcRpP4srUt9yngY","caller":null,"local":"GLkELDUisjnGrSK5wKybht"},"eventVersion":"format version","timeStamp":"2021-10-01T14:55:59.8168722 07:00","eventMetadata":{"deleteTimeStamp":null,"ttlSeconds":null,"isFcra":null,"isDppa":true,"isCCPA":true,"globalProductId":null,"globalSubProductId":null,"mbsiProductId":null},"eventBody":{"sys":"otel","msg":"Testing Centralized Event Publisher with App1 (using logback)","app":{"name":"otel","service":"postHouse","status":"status name","method":"POST","protocol":"HTTP","resp_time_ms":"250","status_code":"4"},}}"

    ] }
`;

// Match JSON part string
let JSONstr = /.*\[\s*\"Receiving message:\s*(.*?)\s*\"\s*]\s*}\s*$/.exec(STDOUT)[1];

// Remove trailing comma(s)
JSONstr = JSONstr.replace(/^(.*\")([^\"] )$/, (s, m1, m2) => `${m1}${m2.replace(/\,/, "")}`);

// Convert to object
const JSONobj = JSON.parse(JSONstr);

// Result
console.log(JSONobj);

CodePudding user response:

Try this one:

/.*?({"type":.*?,"status_code":"\d "\})/

When used in Javascript, the part covered by the parentheses counts as Group 1, i.e.,:

const messJson = JSON.parse(message.match(/.*?({"type":.*?,"status_code":"\d "\})/)[1]);

Reference here: https://regexr.com/66mf2

  • Related