匹配反斜杠

如果要匹配正则表达式中的反斜杠,则必须将其转义。

反斜杠是正则表达式中的转义字符。你可以使用’\\‘来引用正则表达式中的单个反斜杠。

但是,反斜杠也是 Java 文字字符串中的转义字符。要从字符串文字中生成正则表达式,必须转义每个反斜杠。在字符串文字中,’\\\\‘可用于创建带有’\\‘的正则表达式,而’\\‘又可以匹配’\’。

例如,考虑匹配“C:\ dir \ myfile.txt”之类的字符串。正则表达式 ([A-Za-z]):\\(.*) 将匹配,并提供驱动器号作为捕获组。注意加倍的反斜杠。

要在 Java 字符串文字中表达该模式,需要对正则表达式中的每个反斜杠进行转义。

    String path = "C:\\dir\\myfile.txt";
    System.out.println( "Local path: " + path ); // "C:\dir\myfile.txt"
    
    String regex = "([A-Za-z]):\\\\.*"; // Four to match one
    System.out.println("Regex:      " + regex ); // "([A-Za-z]):\\(.*)"
    
    Pattern pattern = Pattern.compile( regex );
    Matcher matcher = pattern.matcher( path );
    if ( matcher.matches()) {
        System.out.println( "This path is on drive " + matcher.group( 1 ) + ":.");
        // This path is on drive C:.
    }

如果你想匹配两个反斜杠,你会发现自己在一个文字字符串中使用八个,在正则表达式中表示四个,以匹配两个。

    String path = "\\\\myhost\\share\\myfile.txt";
    System.out.println( "UNC path: " + path ); // \\myhost\share\myfile.txt"
    
    String regex = "\\\\\\\\(.+?)\\\\(.*)"; // Eight to match two
    System.out.println("Regex:    " + regex ); // \\\\(.+?)\\(.*) 
    
    Pattern pattern = Pattern.compile( regex );
    Matcher matcher = pattern.matcher( path );
    
    if ( matcher.matches()) {
        System.out.println( "This path is on host '" + matcher.group( 1 ) + "'.");
        // This path is on host 'myhost'.
    }