Javascript正则表达式替换,有条件地删除字符串的一部分
我试图提出一个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
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';
}
}
很难说出你想要什么 但是。。。根据示例输入/输出,您可以执行以下操作:
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”,这样它就可以与其他域一起重用。但这不是问题的一部分。它应该使用原始字符串中的域。