【问题标题】:Need explanation on Javascript regex request parameter parsing需要解释 Javascript 正则表达式请求参数解析
【发布时间】:2012-08-23 02:51:24
【问题描述】:

例子第一,问题第二……

示例 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 个参数?

谢谢!

更新

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:

【问题讨论】:

    标签: javascript regex http-request-parameters


    【解决方案1】:

    先回答,后提问:

    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"]
      

    您使用哪种浏览器可以为您提供您为第一个问题提供的结果?

    【讨论】:

    • 将正则表达式文字存储在 var 中,然后您也可以调用 while (reg.exec(str)) 进行迭代。您提出的行为与 OP 的 documentation 中描述的完全相同。
    • @SeanVieira 1) 我在家中使用 Chrome 21 和 Firefox 12 获得您的结果。2) 想确定一下。 3)我上班会查浏览器版本(原贴在谷歌浏览器)。 4) 在 ['sort=alpha', 'direction=asc'] // 完整结果集的摘要的上下文中更有意义(否则我认为我不会问这个问题)(仍然有点令人困惑,宁愿必须完全捕获结果)5)参见第 4 条。
    • @FabrícioMatté 没有遵循 while 语句,也没有参考 OP 的文档。你的意思是它会遍历一个循环两次?
    • @SeanVieira 可能是一个快速浏览器正则表达式 - 要么显示结果摘要,要么只显示第一个匹配的完整匹配......将需要做更多的研究!
    • @chemoish 我的评论是基于您的第 5 个问题(替代替换)。查看this answer了解更多详情。
    猜你喜欢
    • 2023-02-03
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多