【问题标题】:Add colon to file path after drive letter (ie: change /c/ or c/ to c:/) in Java在Java中的驱动器号之后在文件路径中添加冒号(即:将/c/或c/更改为c:/)
【发布时间】:2013-04-30 20:10:35
【问题描述】:

基本上,我从 CSV 文件中的字符串获取文件路径。但是,由于某种原因,生成 CSV 文件的程序从字符串中删除了冒号,所以我最终得到了一个在 Java 内部不起作用的文件路径。典型的输出是/x/Rest/Of/Path,其中x 是驱动器号,但有时可能是x/ 而不是/x/。基本上,如果驱动器号还没有,我需要在驱动器号后添加一个冒号;将/x/x/ 更改为x:/。我确信这主要是通过正则表达式完成的,但我仍在尝试自己弄清楚正则表达式的基础知识,所以我不确定如何编写它。提前感谢您的帮助。

【问题讨论】:

    标签: java regex filepath drive-letter


    【解决方案1】:

    在这里,试试这个,并研究它以了解它是如何工作的:

    String path = "/C/Rest/Of/Path";
    Pattern p = Pattern.compile("^(/?[CDEFGH])/");
    Matcher m = p.matcher(path);
    String pathWithColon = m.replaceAll("$1:/");
    

    这是一个指南:

    1. ^ 被称为。它匹配字符串的开头。没有它,这个正则表达式也会匹配 /foo/C/Rest/Of/Path,我们不希望这样。
    2. ? 可以表示不同的含义,具体取决于它出现的位置。如果它不紧跟左括号(,则不紧跟量词 *+,另一个?{n}{m,n},没有出现在字符类[]中,也没有转义\?,那么它是一个quantifer,意思是“前一个的0或1实体”,在本例中为/。将其视为“可选”运算符。
    3. [CDEFGH] 被称为字符类。它的意思是,“这些字符中的任何一个。”你可以像这样否定一个字符类:[^CDEFGH];这意味着,“任何一个字符,但不是这些。”如果您想接受任何大写字母,则可以使用范围:[A-Z]。如果您愿意接受任何封信,那么:[a-zA-Z]
    4. 围绕大部分正则表达式的括号称为捕获组捕获组。它“保存”了介于两者之间“捕获”的任何东西。
    5. 更换时,可以参考$1$2$3等“已保存”(捕获)的组。 (因此,您可以捕获多个组;每个捕获组按其左括号的顺序编号。)在上面的示例中,请注意我也捕获了/?,所以如果斜杠存在,那么它会输出中也存在,如果不存在,则不存在。

    学习愉快!

    编辑

    我应该举例说明一个更简单的开始方法。我很抱歉。这也可以:

    String path = "/C/Rest/Of/Path";
    path = path.replaceAll("^(/?[CDEFGH])/", "$1:/");
    

    使用编译模式只会提高效率。例如,如果您要替换一个包含 10,000 个路径的数组,您将 编译 一次模式,然后使用 matcher 替换循环中的每个路径。 (如果不进行编译,引擎最终不得不为遇到的每个路径从头开始解析模式。)

    【讨论】:

    • 哇,很高兴我问了。忘记正则表达式,我什至还不熟悉Matcher 部分。我现在对正则表达式有了更好的理解,只是不确定其中的 () 是做什么的。我知道 ^ 指定字符串的开头和 /?意思是“如果第一个/存在”对吗?然后 [] 用于在另一个 / 之前查找包含的字符之一。
    • @DGolberg - 我编辑了我的答案并解释了这些部分。如果有任何不清楚的地方,请随时再次发表评论。
    • 很好,感谢您的留言!它们比我访问过的许多其他关于正则表达式的网站更有帮助!我最初尝试使用.replace(); 做某事,但很快意识到我必须使用其他东西,例如.replaceall();,但不熟悉它。到目前为止,我的经验主要是替换文件名末尾的文件格式标记或检查字符串中的特定单词(基本上是.contains())。
    • 根据您上次的编辑,原始答案可能更适合我的情况,但第二个实例也会派上用场。我基本上是将已完成的项目根文件夹列表加载到数组中,然后循环浏览它们以获取要上传的文件列表。
    • @DGolberg - 我明白了;听起来你是在正确的道路上。事后看来,Regex 看起来很容易,但在第一步之前可能会令人生畏。祝你好运!
    猜你喜欢
    • 2012-09-23
    • 2013-04-02
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多