分离路径的正则表达式

时间:2015-12-18 09:08:01

标签: java regex

您好我尝试使用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.

我的Regx可以告诉我什么可能是错的吗?

5 个答案:

答案 0 :(得分:3)

你可以尝试

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

IDEONE DEMO

如果您想在字符串前保留/,那么您只需将其添加为:

"/"+res[0]

IDEONE DEMO

答案 1 :(得分:2)

就像这样分开:

String[] parts = path.replaceAll("/$", "").split("(?=/)");

replaceAll()调用是删除尾部斜杠(如果有的话)。

请参阅<{p}}的live demo

String path = "/Systems/lenovo/";
String[] parts = path.replaceAll("/$", "").split("(?=/)");
Arrays.stream(parts).forEach(System.out::println);
制造

/Systems
/lenovo

答案 2 :(得分:1)

您不应该使用此replaceAll groups ($3)方法来获取您想要的内容。

使用您的方法在幕后发生的事情是:

正则表达式(.*)(/\\w+)([/][\\w+])匹配字符串/Systems/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方法并不像其他人在此页面上所建议的那样

答案 3 :(得分:0)

你可以试试这个:

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

答案 4 :(得分:0)

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

您可以尝试此操作(请参阅http://ideone.com/dB3edh):

   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));
    }