在Java中的驱动器号(即:change / c /或c / to c:/)之后添加冒号到文件路径

时间:2013-04-30 20:10:36

标签: java regex filepath drive-letter

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

1 个答案:

答案 0 :(得分: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}未出现在字符类 []内,并且未被转义\?,那么它就是 quantfer ,意思是“前一个实体的0或1”,在这种情况下是/。将其视为“可选”操作员。
  3. [CDEFGH]称为字符类。这意味着,“任何一个这些角色。”您可以否定一个字符类,如下所示:[^CDEFGH];这意味着,“任何一个字符,但这些。”如果您想接受任何大写字母,那么您可以使用范围:[A-Z]。如果您想接受任何字母,请:[a-zA-Z]
  4. 围绕大部分正则表达式的括号称为捕获组捕获组。它“拯救”了“夹在中间”的任何东西。
  5. 在替换期间,您可以按$1$2$3等方式引用“已保存”(已捕获)的群组。 (因此,您可以捕获多个组;每个捕获组按其左括号的顺序编号。)在上面的示例中,请注意我也捕获了/?,因此如果斜杠存在,那么它也会存在于输出中,如果没有,则不存在。
  6. 快乐学习!

    修改

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

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

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