Java windows路径的正则表达式

Java windows路径的正则表达式,java,regex,Java,Regex,作为强化修复的一部分,我们需要验证文件路径。比如说, “C:/Users//sample1.txt” “C:\Users\\sample1.txt” 我们已经尝试使用下面的正则表达式来验证上述路径,但当文件路径包含\时,我们以错误告终。 因此,请建议可以接受文件路径中两个斜杠的有效正则表达式 Validator.FilePath=.*[\\]\\[!"#$%&'()_*+,/:;<=>?@\\^`{|}~].* Validator.FilePath=.[\\]\\[!“\\

作为强化修复的一部分,我们需要验证文件路径。比如说,

  • “C:/Users//sample1.txt”
  • “C:\Users\\sample1.txt”
  • 我们已经尝试使用下面的正则表达式来验证上述路径,但当文件路径包含
    \
    时,我们以错误告终。 因此,请建议可以接受文件路径中两个斜杠的有效正则表达式

    Validator.FilePath=.*[\\]\\[!"#$%&'()_*+,/:;<=>?@\\^`{|}~].*
    
    Validator.FilePath=.[\\]\\[!“\\$%&'()\*+,/:;?@\\\^`{124;}~]*
    
    您可以尝试:

    [a-zA-Z]:[\\\/](?:[a-zA-Z0-9]+[\\\/])*([a-zA-Z0-9]+\.txt)
    
    • [a-zA-Z]:
      表示驱动器号,而
    • [\\\/]
      以匹配
      \
      /
    • (?:[a-zA-Z0-9]+[\\/])*
      用于文件夹名称。您可以在字符类中添加可能需要的任何字符。我只使用了
      a-zA-Z0-9
    • ([a-zA-Z0-9]+\.txt)
      用于文件名和
      .txt
      扩展名-它将文件名与扩展名匹配并捕获它
    您可以尝试:

    [a-zA-Z]:[\\\/](?:[a-zA-Z0-9]+[\\\/])*([a-zA-Z0-9]+\.txt)
    
    • [a-zA-Z]:
      表示驱动器号,而
    • [\\\/]
      以匹配
      \
      /
    • (?:[a-zA-Z0-9]+[\\/])*
      用于文件夹名称。您可以在字符类中添加可能需要的任何字符。我只使用了
      a-zA-Z0-9
    • ([a-zA-Z0-9]+\.txt)
      用于文件名和
      .txt
      扩展名-它将文件名与扩展名匹配并捕获它

    FWIW,这是我多年来用来验证任何有效Windows路径+文件的模式:

    ^
      (?<drive>[a-z]:)?
      (?<path>(?:[\\]?(?:[\w !#()-]+|[.]{1,2})+)*[\\])?
      (?<filename>(?:[.]?[\w !#()-]+)+)?[.]?
    $
    
    ^
    (?[a-z]:)?
    (?(?:[\\]?(?:[\w!#()-]+.[.]{1,2})+*[\\])?
    (?(?:[.]?[\w!#()-]+)?[.]?
    $
    
    它容纳存在或不存在的驱动器号、可选根标记、相对路径(“.”和“.”),以及文件和文件夹名称中的句点。通过捕获组标签,提取该信息也变得简单/容易。唯一需要注意的是,它需要对传递的路径名中的双句点进行二次检查


    FWIW,这是我多年来用来验证任何有效Windows路径+文件的模式:

    ^
      (?<drive>[a-z]:)?
      (?<path>(?:[\\]?(?:[\w !#()-]+|[.]{1,2})+)*[\\])?
      (?<filename>(?:[.]?[\w !#()-]+)+)?[.]?
    $
    
    ^
    (?[a-z]:)?
    (?(?:[\\]?(?:[\w!#()-]+.[.]{1,2})+*[\\])?
    (?(?:[.]?[\w!#()-]+)?[.]?
    $
    
    它容纳存在或不存在的驱动器号、可选根标记、相对路径(“.”和“.”),以及文件和文件夹名称中的句点。通过捕获组标签,提取该信息也变得简单/容易。唯一需要注意的是,它需要对传递的路径名中的双句点进行二次检查

    以下是我的解决方案:

    ^(?i)\s*([a-z]:/?)?(?:[^?*:;|<>\r\n\\]*)(/\1*|\1*)(.\1*)*[^.]$
    
    但不是:

    C:notepad++/notepad++/notepad++.exe.txt.
    
    以下是我的解决方案:

    ^(?i)\s*([a-z]:/?)?(?:[^?*:;|<>\r\n\\]*)(/\1*|\1*)(.\1*)*[^.]$
    
    但不是:

    C:notepad++/notepad++/notepad++.exe.txt.
    

    您是否只想检查路径是否有效或它是否实际存在?在后一种情况下,我只需创建一个新的
    文件
    对象,并让框架处理路径转换。在前一种情况下,您可以执行类似的操作,但要迭代父层次结构并检查每个父级,直到达到特定条件。-Alte实际上,你可以看看像ApacheCommons IO这样的库,它们通常都有路径相关的实用程序。你试过这样的方法吗:-.*(\/\\).*(\\\\/)[!“\$%&'(),\/:?\\\\\\^`{124}].私有ESAPIValidationUtils(){}公共静态字符串getValidFilePath(String reqParam){String validFileName=“”;尝试{if(null!=reqParam{validFileName=ESAPI.validator().getValidInput(“文件路径:”,reqParam,“文件路径”,256,true);}}catch(ValidationException ex){Log.error(“com.dextersystems.util.ESAPIValidationUtils”,“getValidFilePath()”,ex);}返回validFileName;}您是否只想检查路径是否有效或它是否实际存在?在后一种情况下,我只需创建一个新的
    文件
    对象,并让框架处理路径转换。在前一种情况下,您可以执行类似的操作,但要迭代父层次结构并检查每个父级,直到达到特定条件。-Alte实际上,你可以看看像ApacheCommons IO这样的库,它们通常都有路径相关的实用程序。你试过这样的方法吗:-.*(\/\\).*(\\\\/)[!“\$%&'(),\/:?\\\\\\^`{124}].私有ESAPIValidationUtils(){}公共静态字符串getValidFilePath(String reqParam){String validFileName=“”;尝试{if(null!=reqParam{validFileName=ESAPI.validator().getValidInput(“文件路径:”,reqParam,“文件路径”,256,true);}}catch(ValidationException ex){Log.error(“com.dextersystems.util.ESAPIValidationUtils”,“getValidFilePath()”,ex);}返回validFileName;}试着解释一下你的解决方案。不满足我上面看到的任何测试。试着解释一下你的解决方案。不满足我上面看到的任何测试。看起来不错,但它没有覆盖相反的斜线。@Dariusz--嗯,这是因为,正如开头行所述,它最初严格用于验证Windows路径和I j我们不在乎Windows最近添加了自动unix语法插值。不过,如果您觉得绝对需要添加对unix路径的支持,那么这是一个非常简单/明显/直接的修改…并不能满足很多变化:例如。“+允许在文件名中使用“,”以及其他一些字符。允许使用多个连续点。等等。“加号”是一个特殊字符(用于文件连接)在DOS 8.3文件名中,它也是根据最佳实践允许在文件名中使用的各种错误字符之一。同样,允许连续句点会导致路径误用,也与最佳实践相反,我对允许任何一种都不感兴趣。不过,如果您不明确根据最佳实践,并希望接受比我更多的字符,模式很容易修改…看起来不错,但它没有覆盖相反的斜杠。@Dariusz--嗯,这是因为,作为开场白