如何在Java中捕获字符的存在

Ram*_*Ram 0 java regex

我的基本目的是找出一个目录是否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 /((.+)(/?+)(.+))^请帮助我解决这个问题

Naw*_*Man 6

首先,您应该使用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)

单独使用'/'并输出'(...)'和'?',使用'[^ /]'(不是/),因为你希望它在那里证明只有一个'/'和不再.

希望这可以帮助.