Java 分离路径的正则表达式

Java 分离路径的正则表达式,java,regex,Java,Regex,您好,我试图使用Java正则表达式从以下路径信息获取所需的上下文路径 String path = "/Systems/lenovo/"; 我想编写正则表达式来分别获取“/Systems”和“/lenovo” 我使用组尝试了以下正则表达式,但没有按预期工作 String systemString = path.replaceAll("(.*)(/\\w+)([/][\\w+])", "$2") - to get "/Systems" - not working String lenovoStr

您好,我试图使用Java正则表达式从以下路径信息获取所需的上下文路径

String path = "/Systems/lenovo/";
我想编写正则表达式来分别获取“/Systems”和“/lenovo”

我使用组尝试了以下正则表达式,但没有按预期工作

String systemString = path.replaceAll("(.*)(/\\w+)([/][\\w+])", "$2") - to get "/Systems" - not working

String lenovoString = path.replaceAll("(.*)(/\\w+)([/][\\w+])", "$3") - to get "/lenovo" - working.
有谁能告诉我我的注册表有什么问题吗?

你可以试试

String PATH_SEPARATOR = "/"; 
String str = "/Systems/lenovo/";
String[] res = str.substring(1).split(PATH_SEPARATOR);

如果您想在字符串之前保留
/
,则只需添加如下内容:

"/"+res[0]

就像这样拆分:

String[] parts = path.replaceAll("/$", "").split("(?=/)");
调用
replaceAll()
将删除尾部斜杠(如果有)

看到

生产

/Systems
/lenovo
您可以尝试以下方法:

String path = "/Systems/lenovo/";
String[] arr = path.split("/");
String str1 = "/"+arr[1];
String str2 = "/"+arr[2];
System.out.println("str1 = " + str1);
System.out.println("str2 = " + str2);
结果是:

str1 = /Systems
str2 = /lenovo

您不应该将此
replaceAll
groups($3)
方法结合使用来获得您想要的东西

在你的方法背后发生的是:

regex
(.*)(/\\w+)([/][\\w+])
匹配字符串
/Systems/l

$1 => ''
$2 => /Systems
$3 => /l
表达式分为以下组:

$1 => (.*)
$2 => (/\\w+)
$3 => ([/][\\w+])
每组匹配匹配字符串的以下部分
/Systems/l

$1 => ''
$2 => /Systems
$3 => /l
所以当你这么做的时候

path.replaceAll((.*)(/\\w+)([/][\\w+]),“$3”)

你基本上在做什么

'/Systems/lenovo/'.replaceAll(`/Systems/l`, '/l') => '/lenovo'
当您使用
$2

'/Systems/lenovo/'.replaceAll(`/Systems/l`, '/Systems') => '/Systemsenovo/'

因此,在这个任务中使用正则表达式组是没有意义的,最好使用简单的
String.split
方法,正如本页其他人建议的那样

要获得/Systems,您需要这个正则表达式:(?:\/[^\/]+) 对于/lenovo,您需要:(?:\/[^\/]+){1}(?=\/$)

您可以尝试以下方法(请参阅):


对于这种操作,
模式
是一种更明智的选择。保留
/
的聪明方法!
   String path = "/Systems/lenovo/";
    Pattern p = Pattern.compile("(?:\\/[^\\/]+)");
    Matcher m = p.matcher(path);

    if(m.find()) {
        System.out.println(m.group(0));
    }
    p = Pattern.compile("(?:\\/[^\\/]+){1}(?=\\/$)");
    m = p.matcher(path);
    if(m.find()) {
        System.out.println(m.group(0));
    }