【问题标题】:Regex for parsing parameters from url用于从 url 解析参数的正则表达式
【发布时间】:2025-12-23 19:10:12
【问题描述】:

我是一个正则表达式的菜鸟,虽然我很努力,但我无法创建正确的正则表达式来执行以下操作:

  1. 获取 url 并检查它是否有一个 '?' 后跟具有不同位数的数字。
  2. 如果匹配正确,获取'?'符号后面的数字
  3. 将此号码与其他号码交换。

假设我们有这个网址:

http://website.com/avatars/avatar.png?56

我们将'56'改为'57'。

我有以下用于搜索的正则表达式,我不确定它是否正确:

\?[0-9]+

但我不知道如何带走?。我应该把它从字符串中扔掉而忘记在这里使用正则表达式吗?那么就只剩下替换部分了。

【问题讨论】:

  • 是否有使用正则表达式的特定原因?您可以分别使用location 对象,location.search
  • 你的正则表达式没问题。您只需要添加回您取出的?。请参阅下面的答案。

标签: javascript jquery regex parsing url


【解决方案1】:

试试这个:

var url = "http://website.com/avatars/avatar.png?56"; 
var match = url.match(/\?(\d+)/); 
if(match != null) {
   url = url.replace(match[1], "new number");
} 

【讨论】:

  • 实际上,不,matches[1] 将是"56",替换语句实际上是:url = url.replace('56', "new number");,URL 值最终是:website.com/pathnew number/avatar.png?56
【解决方案2】:

您的原始正则表达式可以正常工作,只需添加回您要取出的?,如下所示:

var newnum = 57;
url = url.replace(/\?[0-9]+/, '?'+ newnum);

【讨论】:

    【解决方案3】:

    我不是正则表达式专家,但我认为您可以使用 lookaround 忽略“?”

    (?<=?)([0-9]+)
    

    应该在第一场比赛中给你你的号码

    【讨论】:

    • 这很简单,你可以使用 () 来分割匹配的值,上面我的帖子中有一个例子......
    • Javascript 没有后视功能。
    【解决方案4】:

    非常降低方法:

    $('#parse').click(function(e){
        var fromUrl = $('#from-url').val();
        var newNum = parseInt($('#new-number').val(), 10);
    
        var urlRE = /(?!\?)(\d+)$/;
        if (urlRE.test(fromUrl)){
            $('#result').text(fromUrl.replace(urlRE, newNum));
        }else{
            $('#result').text('Invalid URL');
        }
    });
    

    DEMO

    没有过多的校验和、错误检查等。从这里开始,如有必要,请使用window.location 或包含 URL 的字符串。


    分解成一个函数(demo):

    // Call this to replace the last digits with a new number within a url.
    function replaceNumber(url, newNumber){
        // regex to find (and replace) the numbers at the end.
        var urlRE = /\?\d+$/;
    
        // make sure the url end in a question mark (?) and
        // any number of digits
        if (urlRE.test(url)){
            // replace the ?<number> with ?<newNumber>
            return url.replace(urlRE, '?'+newNumber);
        }
    
        // invalid URL (per regex) just return same result
        return url;
    }
    
    alert(replaceNumber('http://website.com/avatars/avatar.png?56', 57));
    

    【讨论】:

    • 表达式/(?!\?)(\d+)$/ 等价于/(\d+)$/(否定的前瞻断言将总是在数字位置为真!)
    • @ridgerunner:他们想确认链接是否以问号 数字结尾。消极的前瞻性验证了这一点。 (除非我误解了你的意思)
    • 不,负前瞻没有这样的事情。它是在第一个数字之前立即应用的零宽度断言 - 它不验证第一个数字之前的字符是否是问号。请记住,前瞻和后瞻断言应用在 个字符之间,在这种情况下,在问号(如果它确实存在)和第一个数字之间。
    【解决方案5】:

    你可以在没有正则表达式的情况下做到这一点。

    var newNum = "57";
    var url = "http://website.com/avatars/avatar.png?56";
    var sUrl = url.split('?');
    var rUrl = sUrl[0] + "?" + newNum;
    alert(rUrl);
    
    1. ?处拆分URL
    2. 这会返回一个数组。
    3. 将数组中的第一项、? 和新数字重新加在一起。

    http://jsfiddle.net/jasongennaro/7dMur/

    【讨论】:

    • 如果? 字符不止一个怎么办? (??query#fragment 中都有效。)另外,如果在数字后面有更多查询参数(或#fragment)怎么办?
    • 谢谢@ridgerunner。我没有考虑任何这些情况,因为 OP 说 check if it has a ? followed by number with varying amount of digits 而他的例子是 http://website.com/avatars/avatar.png?56 我认为这很明确。但同意,更复杂的 URL 需要其他东西。