Как уловить существование персонажа в Java - PullRequest
0 голосов
/ 28 октября 2009

Мое основное намерение состоит в том, чтобы выяснить, находится ли директор А сразу в каталоге Б или нет. Я проверяю это в Java, поэтому я использую классы Pattern и Matcher.

пусть скажем homeDir = / aa / bb / cc (домашний каталог) dirB = / aa / bb / cc / dd / ee (не сразу внутри домашнего каталога) dirC = / aa / bb / cc / dd (сразу внутри домашнего каталога) dirD = / aa / ff (вне дома dir)

Я хочу, чтобы вывод был истинным, если dir находится непосредственно внутри homeDir, в противном случае - 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;

            }
   }

Выход, который я получил, это Итого: dd / eeFirst: dd / eSlash: Last: e . Все, что я хотел, - это хочу, чтобы слэш был захвачен, если таковой существует. Я думаю, во-первых. + Жадный и принимает все. Я пытался с притяжательным квантификатором (/? +), Но он бросал Исключение в потоке "main" java.util.regex.PatternSyntaxException: в позиции 3 в шаблоне регулярного выражения: попытался повторить токен, который уже повторен /aa/bb/cc/((.+)(/?+)(.+)) ^ Пожалуйста, помогите мне решить эту проблему

Ответы [ 3 ]

6 голосов
/ 28 октября 2009

Во-первых, вы должны использовать 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());

Во-вторых, если вы уверены, что псевдоним отсутствует, вы можете также вычесть и удержать.


String  aFileName    = "...";
boolean aIsImmedient = aFileName.substring(aHomeDir.length).contain('/');

Причина, по которой я предлагаю эти два, потому что они быстрее, чем 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 '(..)'
);

Вы используете '/' наедине с '(...)' и '?', Используете '[^ /]' (не / /), потому что вы хотите, чтобы он был там, чтобы доказать соответствие только одного ' / 'и не более.

Надеюсь, это поможет.

2 голосов
/ 28 октября 2009

, если вы хотите узнать, находится ли файл / папка НЕМЕДЛЕННО внутри другого, вам не нужен 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 голосов
/ 28 октября 2009
Pattern p = Pattern.compile("/aa/bb/cc/([^/]+)");
Matcher m = p.matcher(input);
boolean output = m.matches();
if (output)
  System.out.println(m.group(1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...