我的基本目的是找出一个目录是否A立即在dir B内.我在java中检查它所以我正在使用Pattern和Matcher类.
假设homeDir =/aa/bb/cc(主目录)dirB =/aa/bb/cc/dd/ee(不在主目录内)dirC =/aa/bb/cc/dd(在主目录内立即)dirD =/aa/ff(在主场外)
如果dir立即在homeDir中,我希望输出为true,否则为false.我的方法是检查homeDir路径是否与给定的dir路径匹配.如果它匹配,我正在检查homeDir部分是否有/之后.这是我的示例代码
private static final String REGEX =
"homeDir"+"/"+"((.+)(/?)(.+))";
private static final String INPUT =
"/aa/bb/cc/dd/ee";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // get a matcher object
boolean output = false;
while(m.find()) {
System.out.println("Total : "+m.group(1)+"First : "+m.group(2)+ "Slash : "+m.group(3)+"Last : "+m.group(4));
if(m.group(3).length()==0)
{// that means match found and immediately inside also
output = true;
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是 Total:dd/eeFirst:dd/eSlash:Last:e.我想要的就是如果存在任何斜杠,我希望捕获斜线.我认为首先.+贪婪并且全力以赴.我尝试使用所有权量词(/?+),但它在线程"main"java.util.regex.PatternSyntaxException中抛出异常:在正则表达式模式中的位置3:尝试重复已经重复的令牌/ aa/bb/cc /((.+)(/?+)(.+))^请帮助我解决这个问题
首先,您应该使用File而不是RegEx,因为它可以解析所有别名文件,如' ~'或' .'或' ..'.
String aFileName = "...";
File aAbsFile = (new File(aFileName)).getAbsolutePath(); // Resolve Alias here
File aAbsHome = (new File(aHomeDir)) .getAbsolutePath(); // Resolve Alias here
boolean aIsImmediet = aFile.getParent().getCanonicalPath().equals(aAbsHome.getCanonicalPath());
Run Code Online (Sandbox Code Playgroud)
其次,如果你确定没有别名,你可以做的另一种方法是减去和包含.
String aFileName = "...";
boolean aIsImmedient = aFileName.substring(aHomeDir.length).contain('/');
Run Code Online (Sandbox Code Playgroud)
我建议这两个因为它们比RegEx更快的原因.
如果您仍然想要RegEx,请使用' "homeDir/([^/]+)/([^/]+)"'并打印:
System.out.print("Total : %s; First: %s; Last: %s"
m.group(0), // All match
m.group(1), // First '(..)'
m.group(2) // Second '(..)'
);
Run Code Online (Sandbox Code Playgroud)
单独使用'/'并输出'(...)'和'?',使用'[^ /]'(不是/),因为你希望它在那里证明只有一个'/'和不再.
希望这可以帮助.