您好我尝试使用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可以告诉我什么可能是错的吗?
答案 0 :(得分:3)
你可以尝试
String PATH_SEPARATOR = "/";
String str = "/Systems/lenovo/";
String[] res = str.substring(1).split(PATH_SEPARATOR);
如果您想在字符串前保留/
,那么您只需将其添加为:
"/"+res[0]
答案 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));
}