Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,将冒号添加到驱动器号(即:change/c/或c/to c:/)后的文件路径_Java_Regex_Filepath_Drive Letter - Fatal编程技术网

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

在Java中,将冒号添加到驱动器号(即:change/c/或c/to c:/)后的文件路径,java,regex,filepath,drive-letter,Java,Regex,Filepath,Drive Letter,基本上,我从CSV文件中的字符串获取文件路径。然而,由于某些原因,生成CSV文件的程序从字符串中删除了冒号,因此我最终得到了一个在Java内部不起作用的文件路径。典型的输出是/x/Rest/Of/Path,其中x是驱动器号,但有时可能是x/,而不是/x/。基本上,如果驱动器号后面没有冒号,我需要在驱动器号后面加一个冒号;将/x/或x/更改为x://。我确信这主要是通过正则表达式完成的,但我自己仍在尝试弄清楚正则表达式的基本原理,所以我不确定如何编写它。提前感谢您的帮助。在这里,尝试一下,并研究一

基本上,我从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:/");
这里有一个指南:

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

    编辑

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

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

    使用编译后的模式只会提高效率。例如,如果要替换包含10000条路径的数组,则只需编译一次模式,然后使用匹配器替换循环中的每条路径。(如果不进行编译,引擎将不得不从头开始解析遇到的每条路径的模式。)

    哇,很高兴我问了。忘了正则表达式吧,我甚至还不熟悉
    Matcher
    部分。我现在确实对正则表达式有了更好的理解,只是不知道其中的()是做什么的。我知道^指定字符串的开头,而/?表示“如果第一个/存在”,对吗?然后是[]是为了在另一个/@DGolberg之前找到其中一个包含的字符-我编辑了我的答案,并对部分进行了解释。如果有任何不清楚的地方,请随时再次评论。很好,谢谢你的注释!它们比我访问过的许多其他关于regex的网站更有用!我最初尝试使用usi做一些事情ng
    .replace();
    但很快意识到我必须使用其他东西,例如
    .replaceall();
    ,但我对它不熟悉。到目前为止,我的经验主要是替换文件名末尾的文件格式标记或检查字符串中的特定单词(
    .contains()
    基本上)。根据您上次的编辑,原始答案可能更适合我的情况,但第二个实例也会派上用场。我基本上是将已完成的项目根文件夹列表加载到一个数组中,然后在其中循环以获取要上载的文件列表。@DGolberg-我明白了;听起来您是对的h、 Regex在事后看来很简单,但在迈出第一步之前可能会让人望而生畏。祝你好运!