需要解释Javascript正则表达式请求参数解析

时间:2012-08-23 02:51:25

标签: javascript regex http-request-parameters

示例第一,问题第二......

示例1)'?sort = alpha& direction = asc'

的非全局匹配
'?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/);

输出:

// ['sort=alpha', 'sort', '=alpha', 'alpha']

示例2)'?sort = alpha& direction = asc'

的全局匹配
'?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/g);

输出:

// ['sort=alpha', 'sort', '=alpha', 'alpha']

示例3)全局匹配替换'?sort = alpha& direction = asc'

getRequestParameters: function () {
    var query_string = {},
        regex = new RegExp('([^?=&]+)(=([^&]*))?', 'g');

    '?sort=alpha&direction=asc'.replace(regex, function(match, p1, p2, p3, offset, string) {
        console.log(match, p1, p2, p3, offset, string);

        query_string[p1] = p3;
    });
}

输出:

// sort=alpha sort =alpha alpha 1 ?sort=alpha&direction=asc
// direction=asc direction =asc asc 12 ?sort=alpha&direction=asc 


我的问题

我不确定我是否能够自己想出这个,但我从来没有“生活”过一个解决方案,我必须找出原因背后的押韵。我认为的具体匹配“完全理解”。我相信我知道下面的一些答案,但我宁愿不做出假设并向更聪明的人学习!

  1. 为什么1)和2)相同? (或者他们?)
  2. 1)和2)中'sort = alpha'的含义是什么?
  3. 为什么2)不返回排序和方向参数?
  4. 3)使用.replace()迭代什么?
  5. 有没有办法在没有.replace()的情况下捕获N个参数?
  6. 谢谢!

    更新

    var regex = new RegExp('([^?&=]+)(=([^&]*))?');
    regex.exec('?sort=alpha&direction=asc');
    // Chrome 21 - ["sort=alpha", "sort", "=alpha", "alpha"]
    
    var regex = new RegExp('([^?&=]+)(=([^&]*))?', 'g');
    regex.exec('?sort=alpha&direction=asc');
    // Chrome 21 - ["sort=alpha", "sort", "=alpha", "alpha"]
    
    '?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/);
    // Chrome 21 - ["sort=alpha", "sort", "=alpha", "alpha"]
    
    '?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/g);
    // Chrome 21 - ["sort=alpha", "direction=asc"]
    
    var regex = new RegExp('([^?&=]+)(=([^&]*))?', 'g');
    regex.lastIndex = 11;
    regex.exec('?sort=alpha&direction=asc');
    // Chrome 21 - ["direction=asc", "direction", "=asc", "asc"]
    

    总之,示例3)仍然是正确的,但请转到this answer以获得更合格的回复。

    结束更新

    引用并感谢Steven Benner:

1 个答案:

答案 0 :(得分:3)

首先回答问题:

  1. 在Chrome 21和Firefox 14中,["sort=alpha", "direction=asc"]版本都会获得g - 因此它们根本不相同。
  2. 来自match的第一个返回值是整个匹配的字符串(在这种情况下,一个或多个字符不是&符号,问号或等号后​​面可选地后面跟一个等号和零个或多个字符是不是&符号。
  3. 确实如此(请参阅#1的回答) - 您在哪些浏览器中运行这些测试?
  4. replace正在迭代它在字符串中找到的每个匹配项。
  5. 使用多次调用exec或使用您拥有的现有正则表达式:

    > '?sort=alpha&direction=asc&another=value'.match(/([^?&=]+)(=([^&]*))?/g);
    ["sort=alpha", "direction=asc", "another=value"]
    
  6. 您使用哪种浏览器为您提供了第一个问题的结果?