代码之家  ›  专栏  ›  技术社区  ›  Andy Knipp

在Java 11中遇到正则表达式问题

  •  0
  • Andy Knipp  · 技术社区  · 1 年前

    尝试从以下位置剥离服务器名称://some.server.name/path/to/a/dir(以/path/to-a/dir结束)

    我已经尝试了3种不同的正则表达式(硬编码的作品),但其他两种看起来应该有效,但没有。有人能告诉我为什么吗?

    cat测试.java

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class test
    {
    public static void main(String[] args) throws Exception
    {
    
            String rootPath="//server.myco.com/some/path/to/a/doc/root";
            rootPath = rootPath.replace("//[\\w.]*","");
            System.out.println("rootPath - "+rootPath);
            rootPath = rootPath.replace("//[^/]*","");
            System.out.println("rootPath - "+rootPath);
            rootPath = rootPath.replace("//server.myco.com","");
            System.out.println("rootPath - "+rootPath);
    
    }
    }
    
    

    输出:

    rootPath - //server.myco.com/some/path/to/a/doc/root
    rootPath - //server.myco.com/some/path/to/a/doc/root
    rootPath - /some/path/to/a/doc/root
    

    Java 11.0.6:

    $ java --version
    openjdk 11.0.6 2020-01-14
    OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.6+10)
    OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.6+10, mixed mode)
    
    2 回复  |  直到 1 年前
        1
  •  2
  •   Mr. Polywhirl    1 年前

    请避免使用正则表达式来解析URI。如今,大多数语言都包含将URI/URL解析为多个部分的库。

    以下是一个恰当的例子:

    import java.net.URI;
    import java.net.URISyntaxException;
    
    public class ExtractPath {
        public static void main(String[] args) {
            String rootPath = "//server.myco.com/some/path/to/a/doc/root";
            String path = extractPath(rootPath);
            System.out.println(path.equals("/some/path/to/a/doc/root")); // true
        }
    
        public static String extractPath(String location) {
            try {
                return new URI(location).getPath();
            } catch (URISyntaxException e) {
                throw new RuntimeException(e);
            }
        }
    }
    
        2
  •  0
  •   Mukit09    1 年前

    您应该在String类中使用它:

    public String replaceAll(String regex, String replacement) 
    

    而不是这样:

    public String replace(CharSequence target, CharSequence replacement)
    

    当你打电话时 replace("//[\\w.]*","") replace("//[^/]*","") ,正在搜索 "//[\\w.]*" "//[^/]*" 并尝试用空字符串替换。由于给定字符串中没有这样的字符串,因此没有任何更改。

    但是 replaceAll("//[\\w.]*","") 将regex作为第一个参数。因此,它将发挥作用。

    字符串的Oracle Java 11参考 replace() replaceAll()

        3
  •  0
  •   Reilas    1 年前

    您可以使用 URI 为此上课。

    URI u = new URI("//server.myco.com/some/path/to/a/doc/root");
    String p = u.getPath();
    

    输出

    /some/path/to/a/doc/root