java - 在驱动器号后添加冒号到文件路径(即 : change/c/or c/to c:/) in Java

标签 java regex filepath drive-letter

基本上,我从 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. ^ 被称为 anchor 。它匹配字符串的最开头。如果没有它,这个正则表达式也会匹配 /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 个路径的数组,则需要编译该模式一次,然后使用匹配器来替换循环中的每个路径。 (如果不进行编译,引擎最终必须从头开始解析遇到的每个路径的模式。)

关于java - 在驱动器号后添加冒号到文件路径(即 : change/c/or c/to c:/) in Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16308183/

相关文章:

java - 在 Android Room 主线程外返回数据

java - 错误:DexGuard Gradle插件:不支持Android Gradle插件版本。 (4.0.0),受支持的版本包括[2.3.0:3.6。*]

javascript - 实例上的正则表达式总匹配

Javascript:需要正则表达式将字符串拆分为数组,保留小数点和引号不变

python - 给定文件路径时查找最高深度

java - 配置 SOLR 应用程序以索引 pdf 文档

java - 不使用 if-else 语句将不正确的输入消息添加到 java 输入验证程序

c# Regex.Matches 具有多个匹配结果的问题

c# - 从 C# 运行时命令行进程不工作

Python - 打开所有子目录中的所有文本文件,除非文本文件在指定目录中