提问人:Andy Knipp 提问时间:11/15/2023 更新时间:11/15/2023 访问量:61
在 Java 11 中使用正则表达式时遇到问题
Having trouble with regex in Java 11
问:
尝试从以下位置删除服务器名称://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)
答:
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
当你打算将 包装在一个未经检查的异常中时,你可以首先使用。然后,如果发生这种情况,您将获得一个包装,而无需自己动手。URISyntaxException
return URI.create(location).getPath();
IllegalArgumentException
URISyntaxException
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
评论
.replaceAll
.replaceFirst
.replace
.replace
.replaceFirst