user3180402
user3180402

Reputation: 599

Pattern match in javascript

In the below code Im not getting the right result. How can I can do pattern match in javascript?

function getPathValue(url, input) {
    console.log("this is path key :"+input);
    url = url.replace(/%7C/g, '|');
    var inputarr = input.split("|");
    if (inputarr.length > 1)
        input = '\\b' + inputarr[0] + '\n|' + inputarr[1] + '\\b';
    else
        input = '\\b' + input + '\\b';

    var field = url.search(input);
    var slash1 = url.indexOf("/", field);
    var slash2 = url.indexOf("/", slash1 + 1);
    if (slash2 == -1)
        slash2 = url.indexOf("?");
    if (slash2 == -1)
        slash2 = url.length;
    console.log("this is path param value :"+url.substring(slash1 + 1, slash2));
    return url.substring(slash1 + 1, slash2);
}

getPathValue("http://localhost/responsePath/mountainwithpassid|accesscode/100/mountainwithpassid|passid/1","mountainwithpassid|passid")

Im getting the below output

If I pass mountainwithpassid|accesscode as input Im getting output as 100. Same way if I pass

key :mountainwithpassid|passid
value :100 // Expected output 1

Upvotes: 1

Views: 220

Answers (2)

RobG
RobG

Reputation: 147343

I'm trying to understand the question. Given a URL of:

"http://localhost/responsePath/mountainwithpassid|accesscode/100/mountainwithpassid|passid/1"

and an argument of:

"mountainwithpassid|passid"

you expect a return value of:

"1"

An argument of

"mountainwithpassid|accesscode"

should return:

"100"

Is that correct? If so (and I'm not certain it is) then the following may suit:

function getPathValue(url, s) {
    var x = url.indexOf(s);
    if (x != -1) {
      return url.substr(x).split('/')[1];
    }
}

var url = "http://localhost/responsePath/mountainwithpassid|accesscode/100/mountainwithpassid|passid/1";
var x = "mountainwithpassid|passid";
var y = "mountainwithpassid|accesscode";

console.log(getPathValue(url, x)); // 1
console.log(getPathValue(url, y)); // 100

Upvotes: 0

cosjav
cosjav

Reputation: 2115

If your intention is to simply retrieve the value in the path that follows the input (contained within '/') then you can achieve this with a simpler regular expression. First you will need a method to escape your input string since it contains a pipe character '|' which is translated as OR in regex.

You can use this (taken from https://stackoverflow.com/a/3561711):

RegExp.escape= function(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};

Then your getPathValue function can look something like:

function getPathValue(url, input) {
  var pathValue = null;
  var escapedInput = RegExp.escape(input);

  // The RegExp below extracts the value that follows the input and
  // is contained within '/' characters (the last '/' is optional)
  var pathValueRegExp = new RegExp(".*" + escapedInput + "/([^/]+)/?.*", 'g');

  if (pathValueRegExp.test(url)) {
    pathValue = url.replace(pathValueRegExp, '$1');
  }
  return pathValue;
}

You will also need to think about how you handle errors - in the example a null value is returned if no match is found.

Upvotes: 1

Related Questions