JavaScript字符串修改(可能涉及正则表达式)

时间:2013-08-27 23:08:38

标签: javascript html regex

我需要解决的问题是缩短用户提供的文件路径。如果您不知道,有时无法在命令提示符中输入带空格的路径。您需要将路径放在引号中或将带有空格的路径重命名为“abcdef~1”。

示例:“C:\ Some Folder \ Some File.exe”应该变成“C:\ SomeFo~1 \ SomeFi~1.exe”(不区分大小写)。

我正在使用JavaScript创建一个函数来尝试使用这个想法来缩短文件路径。

function ShortenFilePath(FilePath){
    var Sections = FilePath.split("\\")
    for (Index = 0; Index < Sections.length; Index++){
        while (Sections[Index].length > 6 && Sections[Index].match(" ") && !Sections[Index].match("~1")){
            alert(Sections[Index])
            Sections[Index] = Sections[Index].replace(" ","")
            Sections[Index] = Sections[Index].substring(0,6)
            Sections[Index] = Sections[Index] + "~1"
            alert(Sections[Index])
        }
    }
    var FilePath = Sections.join("\\")
    alert(FilePath)
    return FilePath
}

问题是,它会省略文件扩展名并吐出“C:\ SomeFo~1 \ SomeFi~1”。我需要帮助获取该文件扩展名(可能通过正则表达式)。如果您觉得可以优化此功能,请分享您的想法。

更新:我相信问题已经解决。

更新2:以前的代码存在一些问题,所以我稍微修改了一下。

更新3:新问题。让人惊讶。如果没有扩展名的文件本身名称不超过7个字母,那么它将显示为“name.e~1.exe”。

更新4:我想我终于解决了这个问题。我想。

function ShortenFilePath(FilePath){
    var Sections = FilePath.split("\\")
    Sections[Sections.length - 1] = Sections[Sections.length - 1].substring(0,Sections[Sections.length - 1].lastIndexOf("."))
    for (Index = 0; Index < Sections.length; Index++){
        while (Index > 0 && Sections[Index].match(" ") && !Sections[Index].match("~1")){
            Sections[Index] = Sections[Index].replace(/ /gm,"")
            Sections[Index] = Sections[Index].substring(0,6) + "~1"
        }
    }
    return Sections.join("\\") + FilePath.substring(FilePath.lastIndexOf("."))
}

4 个答案:

答案 0 :(得分:0)

我会用它来获得扩展名:

someString.substring(someString.lastIndexOf("."))

你还要求进行一些代码审查,所以:

1 - 您的JS约定有点偏差,它看起来更像C#:)为什么变量和方法名称中的大写字母?

2 - 你说你可以使用引号选项而不是使用~1,看起来更容易,为什么你决定不这样做?

3 - 为什么在JS中需要这样的东西?

答案 1 :(得分:0)

这个怎么样:

function ShortenFilePath(FilePath){
    var Sections = FilePath.split("\\")
    var suffix = FilePath.match(/(\..*$)/)
    for (Index = 0; Index < Sections.length; Index++){
        while (Sections[Index].length > 6 && Sections[Index].match(" ") && !Sections[Index].match("~1")){
            alert(Sections[Index])
            Sections[Index] = Sections[Index].replace(" ","")
            Sections[Index] = Sections[Index].substring(0,6)
            Sections[Index] = Sections[Index] + "~1"
            alert(Sections[Index])
        }
    }
    var FilePath = Sections.join("\\") + (suffix? suffix[1] : '')
    alert(FilePath)
    return FilePath
}

答案 2 :(得分:0)

您可以使用String.prototype.replace进行回调:

function ShortenFilePath(FilePath){
    return FilePath.replace(/([^:\\]+)([\\|\.[^\\]+)/g, function(text,match1, match2){
        return match1.length > 8 ? match1.replace(' ', '').substr(0, 6) + '~1' + match2 : match1.replace(' ', '') + match2;
    });    
}

我并非100%确定这将完全输出你需要的东西但是你可能会得到这个想法:) jsFiddle

答案 3 :(得分:0)

修复更新#3问题:

if (FilePath.lastIndexOf(".") > 6){
   Sections[Index] = Sections[Index].substring(0,6) + "~1"
} else {
   Sections[Index] = Sections[Index].substring(0, FilePath.lastIndexOf(".")) + "~1"
}

顺便说一下,这个:

while (Sections[Index].match(" ")){
   Sections[Index] = Sections[Index].replace(" ","")
}

应该是这样的:

Sections[Index] = Sections[Index].replace(/ /gm, "");