custom.news.google.com news/google/-6ren">
gpt4 book ai didi

javascript - 如果捕获的匹配为空,如何避免捕获组?

转载 作者:行者123 更新时间:2023-12-01 15:16:25 26 4
gpt4 key购买 nike

我想在词前加上 "custom"到一个主机名列表,其子域可以用一些分隔符分隔。
例子:

news.google.com   -> custom.news.google.com
news/google/com -> custom.news.google.com

dev.maps.yahoo.fr -> custom.dev.maps.yahoo.fr
dev/maps/yahoo/fr -> custom/dev/maps/yahoo/fr
这些字符串出现在包含更多内容的文档中,因此我尝试使用正则表达式和 JavaScript 的字符串 replace 来解决这个问题。功能。
主机名和分隔符列表是预先定义好的和已知的。为了这个示例,我只显示了 2 个主机名( news.google.comdev.maps.yahoo.com)和 2 个分隔符( ./),但还有更多。
单个字符串中的分隔符将始终相同,即不会出现 dev/maps.yahoo/fr 之类的情况.
我希望在添加 "custom" 时保持一致并使用正确的分隔符.
我构建了这个长正则表达式:
const myRegex = /news\.google\.com|news\/google\/com|dev\.maps\.yahoo\.fr|dev\/maps\/yahoo\/fr/
(出于可读性目的,这是表达式: /news\.google\.com/或者 /news\/google\/com/或者 /dev\.maps\.yahoo\.fr/或者 /dev\/maps\/yahoo\/fr/)
(注意:重要的是要强调主机名列表是预先定义的并且是众所周知的,这就是为什么我对主机名进行“硬编码”而不使用 \w+\S+ 等标记。例如,我可能想要替换 news.google.com ,但保持 news2.google.com 不变)。
但是,我不确定如何捕获分隔符(无论是 ./ 还是任何其他分隔符)。我尝试使用这样的捕获组:
const myRegex = /news(\.)google\.com|news(\/)google\/com|dev(\.)maps\.yahoo\.fr|dev(\/)maps\/yahoo\/fr/
但是,通过这样做,我创建了 4 个捕获组,并且只有一个分隔符(这只是一个简单的示例)。 3 个捕获组将为空,其中一个将包含分隔符。我怎么知道它是哪个捕获组?
理想情况下,我想要这样的东西:
const myString = 'I navigated to news.google.com'; // For example
const myCustomString = myString.replace(
myRegex,
(match, <SEPARATOR_WRONG>) => `custom${SEPARATOR_WRONG}${match}`,
);

console.log(myCustomString);
// will log 'I navigated to custom.news.google.com'
如果它们是空的,有没有办法跳过捕获的组?

最佳答案

使用\1引用第一个 (\.|\/) 中捕获的分隔符组,这样我们就不必一遍又一遍地写它。

const text = `I navigated to news.google.com
I navigated to news/google/com
I navigated to dev.maps.yahoo.fr
I navigated to dev/maps/yahoo/fr`;

const re = /\w+(\.|\/)(\w+\1)?(google|yahoo)\1\w+/g;
console.log(text.replace(re, (url, separator) => `custom${separator}${url}`));

鉴于评论中描述的新要求,这是一个替代解决方案:

const text = `I navigated to news.google.com
I navigated to news/google/com
I navigated to dev.maps.yahoo.fr
I navigated to dev/maps/yahoo/fr`;

const re = /(news|dev)(\.|\/)(google|maps)\2(com|yahoo)(\2fr)?/g;

console.log(text.replace(re, (url, prefix, separator) => `custom${separator}${url}`));

另一个替代解决方案:

const text = `I navigated to news.google.com
I navigated to news/google/com
I navigated to dev.maps.yahoo.fr
I navigated to dev/maps/yahoo/fr`;

const re = /news(\.)google\.com|news(\/)google\/com|dev(\.)maps\.yahoo\.fr|dev(\/)maps\/yahoo\/fr/g;

console.log(text.replace(re, url => 'custom' + url.match(/\.|\//)[0] + url));

关于javascript - 如果捕获的匹配为空,如何避免捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63106373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com