Java Regex - Изменение пути с псевдонимом - PullRequest
1 голос
/ 21 мая 2011

У меня есть путь с именем $ SERVER / public_html / ab1 / ab2 /.

Я хочу изменить его так, чтобы вместо $ SERVER он просто заменял его моим каталогом пользователя.Поэтому я делаю

path = path.replaceFirst("\\$SERVER", System.getProperty("user.dir"));

, но когда я запускаю его, он удаляет мою \ в новой строке.

F:Programming ProjectsJava Project/public_html/ab1/ab2/

Ответы [ 3 ]

3 голосов
/ 21 мая 2011

Pattern имеет функцию String quote(String), которая поможет вам для первой строки, а Matcher имеет String quoteReplacement(String) для второй:

path = path.replaceFirst(java.util.regex.Pattern.quote("$SERVER"), java.util.regex.Matcher.quoteReplacement(System.getProperty("user.dir")));

edit: причина, по которой вы должны что-то избежать, заключается в том, что вторая строка имеет семантику Matcher.appendReplacement , которая обрабатывает обратные слеши и доллары как escape-следующий символ и вставляет захваченную группу, соответственно.

из документа:

Обратите внимание, что обратная косая черта () и доллар знаки ($) в строке замены может привести к разным результатам чем если бы это рассматривалось как буквенная замена строки. доллар знаки могут рассматриваться как ссылки на захваченные подпоследовательности, как описано выше, а обратные слеши используются для избежать буквальных символов в строка замены.

более очевидное решение (будьте осторожны с необходимостью избежать этой обратной косой черты)

 path = path.replaceFirst("\\$SERVER", System.getProperty("user.dir").replaceAll("\\\\","\\\\\\\\"));
0 голосов
/ 21 мая 2011

Хорошо, поэтому в Windows косые черты по умолчанию выглядят так, как '\', тогда как в * nix косые черты выглядят так '/'. Самый простой способ решить эту проблему - вызвать функцию replace со следующими параметрами '\\' и '/'. Таким образом, ваш путь будет иметь одинаковые косые черты.

0 голосов
/ 21 мая 2011

Да, вы совершенно правы.Я пытаюсь выяснить, почему это происходит так.

Но на данный момент единственное, что я могу предложить, - это пойти с таким решением.

public class RegExTest
{
    public static void main(String[] args)
    {
        String path = "$SERVER/public_html/ab1/ab2";
        System.out.println("path before="+path);
        String user = System.getProperty("user.dir");       
        System.out.println("user="+user);
        System.out.println("replaceFirst using user="+path.replaceFirst("\\$SERVER", user));
        path = path.replaceFirst("\\$SERVER", "");
        path = user +path;
        System.out.println("path after="+path);
    }
}

РЕДАКТИРОВАТЬ : .. Почему это происходит?

Из того, что я вижу в коде строки метода с 701 по 708, они должны это сделать.Они просто пропускают их.Что касается причины, по которой они это делают, я все еще не уверен.

EDIT2: ОК, читая документацию по методу, отвечает на все вопросы.Они делают это, чтобы они могли соответственно интерпретировать специальные символы.Таким образом, при чтении замены они обнаруживают косую черту, алгоритм предполагает, что она может быть частью специального символа, и в результате пропускает ее.

            if (nextChar == '\\') {
                cursor++;
                nextChar = replacement.charAt(cursor);
                result.append(nextChar);
                cursor++;
            } else if (nextChar == '$') {
                // Skip past $
                cursor++;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...