【问题标题】:How do I omit specific string(s) from regex replace?如何从正则表达式替换中省略特定字符串?
【发布时间】:2020-01-25 19:17:45
【问题描述】:

我需要遍历网址并删除域扩展名,除非网址与特定内容匹配。那时我想完全忽略那场比赛。我在 Google Apps Script 中执行此操作,因此它可能缺少一些较新的 Javascript 功能。

我从基础开始,效果很好。

source.replace(/(\.\S+\b)/gi,"")

现在,如果整个字符串是:cars.com,我想忽略扩展名。

[abc.com, yahoo.com, amazon.com, cars.com]
becomes
[abc, yahoo, amazon, cars.com]

我对前瞻/后视的经验很少,这就是我的问题所在。以下尝试仍会从“cars.com”中删除扩展名。

source.replace(/(?<!cars\S+)(\.\S+\b)/gi,"")

我很确定我明白为什么,我只是不知道如何解决它。

【问题讨论】:

  • 您要查找的输出格式是什么? JSON、数组、CSV??

标签: javascript regex google-apps-script


【解决方案1】:

您可以使用带有负前瞻和捕获组的正则表达式:

/\b(?!cars\.com\b)([\w-]+)\.[\w-]+/

RegEx Demo

正则表达式详细信息:

  • \b: 匹配单词边界
  • (?!cars\.com\b):负前瞻丢弃我们前面有cars.com 的匹配
  • ([\w-]+)\.[\w-]+:匹配foo.bar 格式的字符串并在捕获组#1 中捕获点之前的部分
  • '\1' 用于 replacement 将第一部分放回替换字符串中。

代码:

const arr = ['abc.com',
  'yahoo.com',
  'amazon.com',
  'cars.com'];
  
const re = /\b(?!cars\.com\b)([\w-]+)\.[\w-]+/;

arr.forEach(el => {
  console.log( el, '=>', el.replace(re, '\1') );
});

【讨论】:

    【解决方案2】:

    如果您有很多要忽略的 url,您的正则表达式可能会变得非常长,您可以有一个要忽略的 url 数组,映射 urls 数组并仅在不忽略 url 时应用正则表达式:

    const urls = ["abc.com", "yahoo.com", "amazon.com", "cars.com"];
    const ignore = ["cars.com", "other.com"];
    
    const result = urls.map(url => {
      return ignore.includes(url) ? url : url.replace(/(\.\S+\b)/gi, "");
    });
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 2016-08-15
      • 2021-12-19
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多