【问题标题】:Java regex for Windows file pathWindows 文件路径的 Java 正则表达式
【发布时间】:2014-04-01 13:08:37
【问题描述】:

我正在尝试构建一个 Java 正则表达式来在 .txt 文件中搜索 Windows 格式的文件路径,但是,由于文件路径包含文字反斜杠,我的正则表达式失败了。

.txt 文件包含以下行:

C\Windows\SysWOW64\ntdll.dll

但是,文本文件中的某些文件名的格式如下:

C\Windows\SysWOW64\ntdll.dll (some developer stuff here...)

所以我无法使用 String.equals

为了匹配这一行,我使用了正则表达式:

filename = "C\\Windows\\SysWOW64\\ntdll.dll"
read = BufferedReader.readLine();

if (Pattern.compile(Pattern.quote(filename), Pattern.CASE_INSENSITIVE).matcher(read).find()) {

我尝试使用替换方法转义文字反斜杠,即:

filename.replace("\\", "\\\\");

但是,这没有找到,我猜这是因为我需要在 Pattern 构建后进一步转义反斜杠,我想我可能需要转义最多四个反斜杠,即:

Pattern.replaceAll("\\\\", "\\\\\\\\");

但是,每次我尝试时,模式都不匹配。我确定这是反斜杠的问题,但我不确定在哪里进行替换,或者是否有更好的构建模式的方法。

我认为问题进一步复杂化,因为 replaceAll 方法也使用正则表达式,这意味着该模式将在其中有自己的反斜杠,以处理不区分大小写的问题。

任何意见或建议将不胜感激。

谢谢

【问题讨论】:

  • 你的原始字符串会触发编译失败
  • 是的,对不起,让我来解决这个问题。

标签: java regex escaping


【解决方案1】:

您似乎正试图将String 与另一个进行直接比较。对于完全匹配,您可以执行 (

if (read.equalsIgnoreCase(filename)) {

简单的

if (read.startsWith(filename)) {

【讨论】:

  • 它比与java的怪异`\`战斗更好
  • 问题是一些文件路径不一样,以防万一。 txt 文件可能包含 C:\Windows\syswow64\ntdll.dll,而我给出的输入包含确切的大写/小写混合。
  • 或者想一想,会不会更容易从文件中读取该行,将其转换为小写,然后搜索它?
  • 啊,是的,当然。我忘记了那个。我回去看看能不能解决我的问题,谢谢!
  • 我刚刚更新了关于为什么需要使用正则表达式的问题。
【解决方案2】:

试试这个:

从文件中读取每一行时,将“\”替换为“\\”。

然后:

String lLine = "C\\Windows\\SysWOW64\\ntdll.dll";
Pattern lPattern = Pattern.compile("C\\\\Windows\\\\SysWOW64\\\\ntdll\\.dll");
Matcher lMatcher = lPattern.matcher(lLine);
if(lMatcher.find()) {
    System.out.println(lMatcher.group());
}

lLine = "C\\Windows\\SysWOW64\\ntdll.dll (some developer stuff here...)";
lMatcher = lPattern.matcher(lLine);
if(lMatcher.find()) {
    System.out.println(lMatcher.group());
}

【讨论】:

    【解决方案3】:

    正确的用法是:

    String filename = "C\\Windows\\SysWOW64\\ntdll.dll";
    String file = filename.replace('\\', ' ');
    

    【讨论】:

    • 我不明白?为什么要用空格替换原来的反斜杠?
    • 我刚刚给出了正确用法的例子
    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多