Java 11正则表达式问题:无法去除路径中的服务器名称
问题原因分析
核心问题是用错了字符串替换方法:
- Java的
String.replace(CharSequence, CharSequence)是字面量匹配替换,它不会把第一个参数当作正则表达式解析。你写的"//[\\w.]*"和"//[^/]*"会被当成普通字符串去匹配原路径,而原路径里根本没有[\\w.]*或[^/]*这些字符,自然替换失败。 - 第三种硬编码的
"//server.myco.com"是原路径里真实存在的字面内容,所以replace方法能精准匹配并替换,因此生效。
修正方案
要使用正则表达式替换,必须用String.replaceAll(String regex, String replacement)(或replaceFirst,因为只需要替换开头一次)。同时注意Java字符串的正则转义规则,修正后的测试代码如下:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class test { public static void main(String[] args) throws Exception { String originalPath = "//server.myco.com/some/path/to/a/doc/root"; // 正则匹配//开头的服务器域名(字母+点的组合) String path1 = originalPath.replaceAll("//[\\w.]+", "").trim(); System.out.println("path1 - " + path1); // 正则匹配//开头直到第一个/的所有内容(适配任何非/的服务器标识) String path2 = originalPath.replaceAll("//[^/]+", "").trim(); System.out.println("path2 - " + path2); // 原有的硬编码字面量替换 String path3 = originalPath.replace("//server.myco.com", "").trim(); System.out.println("path3 - " + path3); } }
执行后输出:
path1 - /some/path/to/a/doc/root path2 - /some/path/to/a/doc/root path3 - /some/path/to/a/doc/root
注:因为服务器部分仅在开头出现一次,用replaceFirst替代replaceAll效率更高,效果完全一致。
内容的提问来源于stack exchange,提问作者Andy Knipp
相关产品推荐
相关产品推荐

