2009-10-28 7 views
0

Mon intention de base est de savoir si un dir dira A se trouve immédiatement dans le répertoire B ou non. Je le vérifie en java donc j'utilise des classes Pattern et Matcher.Comment capturer l'existence d'un caractère en Java

laisser dire homedir =/aa/bb/cc (répertoire personnel) DGDIR =/aa/bb/cc/dd/ee (non immédiatement à l'intérieur la maison dir) DIRC =/aa/bb/cc/dd (immédiatement dans le répertoire home) dirD =/aa/ff (hors répertoire de départ)

Je veux que la sortie soit vraie si le répertoire est immédiatement dans homeDir, sinon faux. Mon approche est de vérifier si le chemin homeDir correspond au chemin du répertoire donné. Si cela correspond, je vérifie s'il y a une partie/après la partie homeDir. Ceci est mon exemple de code

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; 

      } 
    } 

Le eteint que je reçois est Total: jj/eeFirst: jj/eSlash: Dernier: e. Tout ce que je voulais, c'est que le slash soit capturé s'il en existe. Je pense d'abord. + Est gourmand et prend tout. J'ai essayé avec le quantificateur possessive (/? +) Mais le lancement Exception dans le fil "principal" java.util.regex.PatternSyntaxException: A la position 3 dans le modèle d'expression régulière: a tenté de répéter un jeton qui est déjà répété /aa/bb/cc /((.+)(/?+)(.+)) ^ me aider S'il vous plaît chaud pour aller à ce problème

Répondre

2

Si vous voulez seulement savoir si un fichier/dossier est IMMEDIATEMENT dans un autre, vous n'avez pas besoin de REGEXP.

public static boolean isImmediateParent(String parentPath, String childPath) 
{ 
    int index = childPath.lastIndexOf("/"); 
    if (index == -1) 
     throw new IllegalArgumentException("child has no parent"); 
    return childPath.substring(0, index).equals(parentPath); 
} 

isImmediateParent("a", "a") = exception 
isImmediateParent("a", "a/b") = true 
isImmediateParent("a", "a/b/c") = false 
isImmediateParent("a", "b/a") = false 
+0

simple et efficace – Ram

+0

Oui, mais gardez à l'esprit différents séparateurs de fichiers sur différents os - pour gérer que je ferais un .replaceAll ("\\\\", "/") sur les deux paramètres au début qui est plus simple que d'utiliser le séparateur approprié. – pstanton

0
Pattern p = Pattern.compile("/aa/bb/cc/([^/]+)"); 
Matcher m = p.matcher(input); 
boolean output = m.matches(); 
if (output) 
    System.out.println(m.group(1)); 
6

d'abord, vous devez utiliser fichier et non regex comme il peut résoudre tous les fichiers d'alias comme '~' ou '.' ou '..'. Deuxièmement, si vous êtes sûr qu'il n'y a pas d'alias, une autre méthode consiste à soustraire et à contenir. La raison pour laquelle je suggère ces deux parce qu'ils sont plus rapides que RegEx

Si vous voulez toujours RegEx, utilisez '"homeDir/([^/]+)/([^/]+)"' et vous imprimez sera: '?'


System.out.print("Total : %s; First: %s; Last: %s" 
    m.group(0), // All match 
    m.group(1), // First '(..)' 
    m.group(2) // Second '(..)' 
); 

Vous utilisez seul '/' avec des '(...)' et utilisation « [^/] '(pas un /) parce que vous voulez qu'il soit là pour prouver la correspondance d'un seul'/'et pas plus.

Espérons que cela aide.

+1

Correctement correct. Cependant, 1) vous devez utiliser 'getCanonicalPath()', 2) il ne résoudra pas '" ~ "', 3) il résoudra les liens symboliques et/ou les noms de lecteurs (selon la plate-forme OS), et 4) '". "' et '" .. "' ne sont pas des alias à proprement parler. –

+0

Hey Stephen Cobert, Vous avez raison, 'getCanonicalPath()', je vais résoudre ce problème. : D – NawaMan

Questions connexes