在 Java 中,在驱动器号后将冒号添加到文件路径(即:将 /c/ 或 c/ 更改为 c:/)



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

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

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},没有出现在字符类[]中,并且没有转义?,那么它是一个量词,意思是"前一个实体的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 个路径的数组,则需要编译一次模式,然后使用匹配器替换循环中的每个路径。(如果不进行编译,引擎最终将不得不从头开始解析遇到的每个路径的模式。

相关内容

  • 没有找到相关文章

最新更新