【问题标题】:Regex matching data from URL returning only 1 match when there is two当有两个匹配时,来自 URL 的正则表达式匹配数据仅返回 1 个匹配
【发布时间】:2017-03-07 07:15:35
【问题描述】:

根据我提交的 URL 有两个匹配项。他们是 'en-gb' 和 'uk-ireland'

网址:https://www.myabcalphabeta.com/en-gb/destinations/uk-ireland

但是当我返回函数时,它只返回最后一个函数,即 'uk-ireland'

如何捕捉第一场比赛“en-gb”。我还看到循环工作正常,因为它返回了两个值。

控制台中的输出屏幕截图。

    $(document).ready(function(){
        function getURLLocale() {
        var url = $(location).attr("href");
        var localeRegex = /^[a-z][a-z]-[a-z][a-z]/g;
        var urlBreakdown = url.split("/");
        console.log(urlBreakdown);
        var lang = "en";
        var country = "gb";

        for(var i = 0; i < urlBreakdown.length; i++) {
            if(urlBreakdown[i].match(localeRegex)) {
                lang = urlBreakdown[i].split("-")[0];
                country = urlBreakdown[i].split("-")[1];
                console.log(lang+ "\n");
            };
        }

        return([lang, country]);
    } // End function getURLLocale()
    console.log(getURLLocale());
})

【问题讨论】:

  • 第一次匹配时不要返回值而不是console.log。
  • 将所有巧合放入数组中,不仅是lasto,还是做之前的评论@YonghoonLee
  • @YonghoonLee 无效。

标签: javascript arrays regex


【解决方案1】:

我认为你可以这样做:

const url = `https://www.myabcalphabeta.com/en-gb/destinations/uk-ireland`

const getUrlData = url => {
  const en = url.match(/\ben-?\w*\b/)
  const uk = url.match(/\buk-?\w*\b/)
  const result = []
  if (en) result.push(en[0])
  if (uk) result.push(uk[0])
  return result
}

console.log(getUrlData(url))

或者这个

const url = `https://www.myabcalphabeta.com/en-gb/destinations/uk-ireland`

const getUrlData = url => {
  const regex = /\b[a-z]{2}-[a-z]*\b/g
  const result = []
  let temp

  while (temp = regex.exec(url)) {
    result.push(temp[0])
  }
  return result
}
console.log(getUrlData(url))

这将选择以 2 [a-z] 开头的任何部分,然后必须以单词开头 - 以及所有 [a-z] 直到不是单词

【讨论】:

    【解决方案2】:

    使用正则表达式 (\w{2}-\w{2,}) 从 url exec 获取所有语言环境。

    $(document).ready(function () {
        function getURLLocale() {
            var url = 'https://www.myabcalphabeta.com/en-gb/destinations/uk-ireland';
            var m;
            var regex = /(\w{2}-\w{2,}(-\w{2})?)/g;
            var locales = [];
    
            while (m = regex.exec(url)) {
                locales.push(m[0]);
            }
    
            return locales;
        } // End function getURLLocale()
        console.log(getURLLocale());
    });
    

    该数组将包含两个语言环境。如果您只想获取第一个,而不是getURLLocale(),请打印getURLLocale()[0]

    编辑

    我将正则表达式更改为 (\w{2}-\w{2,}(-\w{2})?),因此您可以匹配 this 列表中的任何可能的语言环境

    【讨论】:

    • 所以这是 www.awwwards.com/websites/e-commerce 电子商务国家:D
    【解决方案3】:

    你的表达有误:

    将正则表达式更改为^[a-z][a-z]-[a-z][a-z]$

    Have a look

    $(document).ready(function(){
            function getURLLocale() {
            var url = "https://www.myabcalphabeta.com/en-gb/destinations/uk-ireland";
            var localeRegex = /^[a-z][a-z]-[a-z][a-z]$/g;
            var urlBreakdown = url.split("/");
            console.log(urlBreakdown);
            var lang = "en";
            var country = "gb";
    
            for(var i = 0; i < urlBreakdown.length; i++) {
                if(urlBreakdown[i].match(localeRegex)) {
                    lang = urlBreakdown[i].split("-")[0];
                    country = urlBreakdown[i].split("-")[1];
                    console.log(lang+ "\n");
                };
            }
    
            return([lang, country]);
        } // End function getURLLocale()
        console.log(getURLLocale());
    })
    

    【讨论】:

    • 你的答案是正确的。你能解释一下美元符号吗?它是指最后一个搜索项吗?是从右到左搜索吗?
    • 我如何匹配两个字母的任何想法?
    • @Santosh ^[a-z][a-z]-[a-z][a-z]$ 代表 twoletter-twoletter^ 是字符串的开头,$ 是字符串的结尾。在上面我提到的表达式中,字符串应该从头到尾匹配两个字母。
    • 那么为什么它匹配 'uk-ireland' ,因为 'ireland' 有 7 个字母?
    • @Santosh 它与uk-ireland 不匹配。您已将 URL 与 / 分开。这就是为什么它在循环时进入数组。
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多