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

Having trouble with regex in Java 11

提问人:Andy Knipp 提问时间:11/15/2023 更新时间:11/15/2023 访问量:61

问:

尝试从以下位置删除服务器名称://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)
正则表达式 java-11 字符串匹配

评论

2赞 The fourth bird 11/15/2023
你是在寻找还是代替?.replaceAll.replaceFirst.replace
0赞 Andy Knipp 11/15/2023
谢谢,replaceAll做到了。为什么我需要 replaceAll?字符串中只有一个实例。
0赞 The fourth bird 11/15/2023
使用不采用正则表达式。如果要替换单个匹配项,请使用.replace.replaceFirst

答:

3赞 Mr. Polywhirl 11/15/2023 #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赞 Usagi Miyamoto 11/15/2023
不要使用 URL 进行检查/解析,而是使用 URI:“如前所述,URL 和 URLConnection 依赖于必须存在的协议处理程序,否则会引发异常。
0赞 Andy Knipp 11/15/2023
它本身不是一个 URL,但我明白你的意思。谢谢。
0赞 Mr. Polywhirl 11/15/2023
@UsagiMiyamoto我解决了这个问题。谢谢。
1赞 Holger 11/15/2023
当你打算将 包装在一个未经检查的异常中时,你可以首先使用。然后,如果发生这种情况,您将获得一个包装,而无需自己动手。URISyntaxExceptionreturn URI.create(location).getPath();IllegalArgumentExceptionURISyntaxException
0赞 Mukit09 11/15/2023 #2

您应该在 String 类中使用它:

public String replaceAll(String regex, String replacement) 

取而代之的是:

public String replace(CharSequence target, CharSequence replacement)

当您调用 或 时,它会分别搜索 or,并尝试用空字符串替换。由于给定字符串中没有这样的字符串,因此没有变化。replace("//[\\w.]*","")replace("//[^/]*","")"//[\\w.]*""//[^/]*"

但将正则表达式作为第一个参数。因此它会起作用。replaceAll("//[\\w.]*","")

String replace() 和 replaceAll( 的 Oracle Java 11 参考

1赞 Reilas 11/15/2023 #3

为此,您可以利用 URI 类。

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

输出

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