javascript中的模式匹配

时间:2014-02-18 04:14:46

标签: javascript regex node.js pattern-matching

在下面的代码中我没有得到正确的结果。我怎样才能在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")

我得到以下输出

  

如果我传递mountainwithpassid | accesscode作为输入,我得到输出为   100.如果我通过

,也一样      

key:mountainwithpassid | passid
值:100 //预期输出1

2 个答案:

答案 0 :(得分:1)

如果您的目的是简单地检索输入后面的路径中的值(包含在'/'中),那么您可以使用更简单的正则表达式来实现此目的。首先,您将需要一个方法来转义输入字符串,因为它包含管道符“|”在正则表达式中翻译为OR。

您可以使用此功能(取自https://stackoverflow.com/a/3561711):

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

然后你的getPathValue函数看起来像:

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;
}

您还需要考虑如何处理错误 - 在示例中,如果未找到匹配项,则返回null值。

答案 1 :(得分:0)

我试图理解这个问题。给定URL:

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

和论点:

"mountainwithpassid|passid"

您希望返回值为:

"1"

的论据
"mountainwithpassid|accesscode"

应该返回:

"100"

这是对的吗?如果是这样(我不确定),那么以下内容可能适用:

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