2013-02-26 129 views
1

在Javascript中,我正在寻找将URI转换为Windows格式的正则表达式,但我不太熟悉构成正则表达式的URI情况。 基本上...将URI转换为Windows路径格式

  • /c/myDocs/file.txt
  • //myDocs/file.txt

应改为

"C:\myDocs\file.txt" 

有可能是我不知道的其他情况。因此需要一些帮助。到目前为止,我只用交换替换了斜线,而不是用正则表达式替换了驱动名称。

function pathME(apath) 
{ 
    apath = apath.replace(/\//g, "\\") 
    return apath; 
} 

正则表达式向导,请启动您的引擎!

+0

嘿人,我的解决方案是正则表达式(按要求),并应付所有驱动器也,并张贴过。你为什么不喜欢它?并且是一个oneliner(与methode链接,但仍然可以) – 2013-02-26 15:04:11

回答

1

我假设C盘赢” t是你的路径字符串中唯一的驱动器,所以写了一个模拟你的小型pathME()函数。这应该涵盖你提到的所有情况。

function pathME(apath) { 
    //Replace all front slashes with back slashes 
    apath = apath.replace(/\//g, "\\"); 

    //Check if first two characters are a backslash and a non-backslash character 
    if (apath.charAt(0) === "\\" && apath.charAt(1) !== "\\") { 
     apath = apath.replace(/\\[a-zA-Z]\\/, apath.charAt(1).toUpperCase() + ":\\"); 
    } 

    //Replace double backslash with C:\ 
    apath = apath.replace("\\\\", "C:\\"); 
    return apath; 
}
2

这将涵盖两种情况以上:

mystring.replace(/^\/([^\/]?)\//, function(match, drive) { 
    return (drive || 'c').toUpperCase() + ':\\'; 
}).replace(/\//g, '\\'); 
+0

+1 Nice功能在替换函数中调用! *我喜欢* – 2013-02-26 12:55:31

0

无需这里的任何正则表达式。你可以用简单的字符串操作来完成它,我想。如果你愿意,这样你可以更好地处理输入字符串中的错误。

var newpath = apath.replace(/\//g, '\\'); 
var drive = null; 
if (newpath.substring(0, 2) == '\\\\') { 
    drive = 'c'; 
    newpath = newpath.substring(1); 
} 
else if (newpath.substring(0, 1) == '\\') { 
    drive = newpath.substring(1, newpath.indexOf('\\', 2)); 
    newpath = newpath.substring(newpath.indexOf('\\', 2)); 
} 
if (drive != null) { newpath = drive + ':' + newpath; } 

并在旁注:我不知道你的问题的范围,但会有一些情况下,这不起作用。例如,在Unix中,网络共享将被安装到/any/where/in/the/filesystem,而在Windows中,则需要\\remotehost\share\,因此很明显一个简单的转换在这里不起作用。

+0

-1,因为正则表达式搜索不是Js-Code – 2013-02-26 12:53:30

+1

他来这里寻求建议,他得到了我最好的。他描述了一个问题,我给了他一个解决方案。在我看来,没有必要降低这一点。如果他能够提出一个合理的论点,说明他为什么需要*正则表达式......很好,但到目前为止,我看不到这一点。 – 2013-02-26 12:55:11

+1

好吧,我在那里顶了一下。对不起,今天咖啡太多了。 :) – 2013-02-26 12:57:23

1

这个表达式应该可以解决你的问题,但可以优化 负责所有驱动器名称的长度为1:

"/c/myDocs/file.txt".replace(/\//g,"\\").replace(/^(\\)(?=[^\\])/, "").replace(/^(\w)(\\)/g, "$1:\\") 
    // Result is "c:\myDocs\file.txt" 

例二

"//myDocs/file.txt".replace(/\//g,"\\").replace(/^(\\)(?=[^\\])/, "").replace(/^(\w)(\\)/g, "$1:\\") 
// Result is "\\myDocs\file.txt"