Javascript 从只发生一次的链接中查找字母的精确匹配

Javascript 从只发生一次的链接中查找字母的精确匹配,javascript,regex,Javascript,Regex,我创建了一些代码,根据链接中找到的语言添加一些文本,但是我在完全匹配语言方面遇到了问题,因为模式太简单了。我需要准确地找到.com之后的内容,而不是其他内容。我尝试了这个/.\/.\/.*?\/(\S{2})/gm表达式,但它并不完全是我想要的 //查找页面的url //const findUrl=window.location.href; 常量findUrl=”https://www.example.com/fr/Pages/examplefr.html"; 控制台日志(findUrl);

我创建了一些代码,根据链接中找到的语言添加一些文本,但是我在完全匹配语言方面遇到了问题,因为模式太简单了。我需要准确地找到.com之后的内容,而不是其他内容。我尝试了这个
/.\/.\/.*?\/(\S{2})/gm
表达式,但它并不完全是我想要的

//查找页面的url
//const findUrl=window.location.href;
常量findUrl=”https://www.example.com/fr/Pages/examplefr.html";
控制台日志(findUrl);
常数langs=[{
模式:/en/,//严格地只查找en
文本:“用很长的英文文本替换现有文本”
},
{
模式:/fr/,//严格地只查找fr
文本:“我是法国人”
},
{
模式:/es/,//严格地只查找es
文字:“没有哈布罗西班牙人。”
}
];
让发现=错误;
for(设i=0;i

这里有一些文字

您好,请检查此代码段


工作原理
  • 我们正在使用.map
    langs.map(e=>…)

  • 我们正在使用
    findUrl.match(newregexp(
    .com${e.pattern}.
    ,“g”)

  • 我们使用
    .filter(e=>!!e).pop()从数组中提取匹配值

  • const findUrl=”https://www.example.com/fr/Pages/examplefr.html";
    常数langs=[{
    模式:/en/,//严格地只查找en
    文本:“用很长的英文文本替换现有文本”
    },
    {
    模式:/fr/,//严格地只查找fr
    文本:“我是法国人”
    },
    {
    模式:/es/,//严格地只查找es
    文字:“没有哈布罗西班牙人。”
    }
    ];
    常数结果=(
    langs.map(e=>!!findUrl.match(新的RegExp(`.*\.com${e.pattern}.*`,“g”))?e.text:null.filter(e=>!!e).pop()
    );
    text.innerText=结果;
    console.log(结果);

    您可以使用类似于
    /\.com\/(\w{2})\/
    的正则表达式来获取语言并将其作为文本进行比较。如果
    langs
    对象的格式为
    {[lang:string]:string}
    ,这将更容易

    const findUrl=”https://www.example.com/fr/Pages/examplefr.html";
    控制台日志(findUrl);
    常数langs={
    “en”:“用很长的英文文本替换现有文本”,
    “fr”:“我是法国人”,
    “es”:“hablo español.”,
    };
    if(!findLanguage())console.log(“未找到匹配项”);
    函数findLanguage(){
    var result=/\.com\/(\w{2})\/.exec(findUrl);
    if(结果和结果[1]以langs表示){
    log(“已找到匹配项!”);
    document.querySelector(“#texts p”).textContent=langs[result[1];
    返回true;
    }
    }
    
    这里有一些文字


    您可以从原始URL提取“lang模式”,并在数组中找到与此模式匹配的对象:

    //查找页面的url
    //const findUrl=window.location.href;
    常量findUrl=”http://enmicasa.com/es/Pages/examplefr.com/fr";
    控制台日志(findUrl);
    常数langs=[{
    模式:“en”,//严格地只查找en
    文本:“用很长的英文文本替换现有文本”
    },
    {
    模式:“fr”,//严格地只查找fr
    文本:“我是法国人”
    },
    {
    模式:“es”,//严格地只查找es
    文字:“没有哈布罗西班牙人。”
    }
    ];
    const myLang=langs.find(obj=>findUrl.replace(/.*\.com\/(.+?)\/.*/,“$1”)==obj.pattern);
    如果(米朗){
    log(“已找到匹配项!”);
    让findP=document.getElementById(“text”).queryselectoral(“p”);
    findP[0]。innerText=myLang.text;
    }否则{
    log(“未找到匹配项”);
    }
    
    这里有一些文字


    if
    语句中不需要
    !!
    。最好使用
    some
    而不是
    map
    在找到第一个数据类型后立即停止。是的,但将任何数据类型(在本例中为数组)转换为布尔值是一种平滑的方法。这是一种(不必要的)但是普通过程。@nickzoumif块无论如何都会进行转换。不是我的下一票(只是重新访问此线程以删除我的答案,我的答案也被下一票)。不过,我可能会想出几个原因,说明你的帖子可能会被下一票,以及为什么它根本不是一个平滑的解决方案。使用
    match()
    并将其输出转换为布尔值是一种过分的做法,有一个
    RegExp.prototype.test()
    。另一个可能是事实,您使用
    map()
    filter()
    不必要地迭代源数组两次,其中simple
    array.prototype.find()
    会更好地退出(第一个)循环,一旦(单张,如果回忆一下问题陈述)找到匹配项。还有一张是您的代码格式非常糟糕。这些提示不会删除那些否决票,但可能会帮助您避免进一步的否决票;)