Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式替换,有条件地删除字符串的一部分_Javascript_Regex - Fatal编程技术网

Javascript正则表达式替换,有条件地删除字符串的一部分

Javascript正则表达式替换,有条件地删除字符串的一部分,javascript,regex,Javascript,Regex,我试图提出一个Javascript正则表达式命令,将这些输入转换为以下输出: INPUT DESIRED OUTPUT mydomain.com --> mydomain.com foo.mydomain.com --> mydomain.com dev.mydomain.com --> dev.mydomain.com dev-foo.mydomain.com --> dev.my

我试图提出一个Javascript正则表达式命令,将这些输入转换为以下输出:

INPUT                      DESIRED OUTPUT
mydomain.com          -->  mydomain.com
foo.mydomain.com      -->  mydomain.com
dev.mydomain.com      -->  dev.mydomain.com
dev-foo.mydomain.com  -->  dev.mydomain.com
规则如下:

  • 从域中删除子域,除非子域以字符“dev”开头
  • 如果子域以“dev”开头,则输出“dev.domain.com”
  • 保留域末尾指定的任何端口
我的正则表达式技能让我失望。这就是我到目前为止所做的:

'mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// .mydomain.com

'foo.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// foo.mydomain.com

'dev-foo.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// dev.mydomain.com

'dev.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// dev.mydomain.com
前两次失败,后两次成功。有什么建议吗

这是一个可以工作的javascript,但我希望将其合并到一个regexreplace命令中。注意,我还希望保留在dmain末尾指定的任何端口

var getHost = function () {
  var host = window.location.host;
  if (host.substring(0,3) === 'dev') {
    return host.replace(/^(dev)?(-.*)?(mydomain\.com.*)/,'$1.$3');
  }
  else {
    return 'mydomain.com';
  }
}

很难说出你想要什么

但是。。。根据示例输入/输出,您可以执行以下操作:

  • 在第一个期间拆分输入
  • 如果第一部分包含单词“dev”,则将其替换为“dev”
  • 如果第一部分不包含单词dev,请将其删除
  • 如果您真的想要正则表达式,则无需正则表达式:

    function trimInput(s) {
        var n = s.indexOf('.');
        if (n === -1) {
            return s;
        }
        var head = s.substring(0, n);
        if (head.indexOf("dev") !== -1) {
            return "dev." + s.substring(n);
        }
        else {
            return s.substring(n);
        }
    }
    

    如果这不是您想要的,请更新您的问题以指定您想要的。

    您可以使用函数在替换中使用JS中的更多控件修改值

    var value = "dev-foo.mydomain.com".replace(/^(dev)?[^\.]+\./, function (match, p1) {
        return p1 ? p1 + '.' : '';
    });
    

    只是为了说明可以在单个正则表达式中执行以下操作:

    'string'.replace(/(?:(^dev).*(\.)|^.*)(mydomain\.com)/, '$1$2$3');
    
    工作示例:

    下面是细分:它要么匹配
    dev
    something
    ,要么匹配任何东西。如果它与包含“dev”的模式匹配,
    $1
    将包含“dev”,而
    $2
    将包含“.”。如果它与包含“dev”的模式不匹配,
    $1
    $2
    将为空。(
    $3
    在任何一种情况下都将包含“mydomain.com”。)

    所以这是可能的,但它很复杂


    我的建议是做一些比这更具可读性和可维护性的事情。在我看来,花在计算这行代码上的时间和痛苦不值得节省一两行代码长度。

    您能解释一下这里应该应用的一般规则吗?根据您的示例输入/输出,可以假设您正在寻找删除连字符、句点和单词foo(当它们出现在第一个句点之前)的方法。这就是你想要的吗?你能再解释一下你想要正则表达式做什么吗?因此,它采用字符串形式
    mydomain.com
    (something).mydomain.com
    ,并且应该始终返回
    mydomain.com
    ,除非
    (something)
    包含单词“dev”,在这种情况下,它应该是
    dev.mydomain.com
    ??或者你只是想删除任何出现的
    foo
    ?@jahroy我已经用要使用的规则更新了问题。也许你可以撤销否决票?@mathematic.coffee抱歉,我遗漏了一些重要的细节。我已经用更多信息更新了这个问题。也许你可以撤销否决票?对不起@Tauren,我没有否决票。谢谢你提供的额外细节。是的,你的描述解释了我想要什么。但我的目标显然并不明确,因为如果可能的话,我想把它简化成一个正则表达式。在大多数情况下,这将是首选。啊,我想你已经找到了解决方案。您的代码不适用于
    mydomain.com
    dev.mydomain.com
    ,但我认为这正是我想要的。+1表示“做一些更可读和可维护的事情”。我认为在这里使用正则表达式没有任何好处。干得好@wiseguy!我完全同意你对可读性和可维护性的看法。但我的问题只是我真正想做的一个简单的例子。在我的情况下,把它封装成一个正则表达式更有意义。@jahroy说“这是你的答案,现在请不要使用它”,感觉有点傻lol@Wiseguy是的,你的解决方案会奏效。非常感谢。我只是想让域成为通用的,而不是“mydomain”,这样它就可以与其他域一起重用。但这不是问题的一部分。它应该使用原始字符串中的域。