Регулярное выражение Java — изменение пути с помощью псевдонима

#java #regex

#java #регулярное выражение

Вопрос:

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

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

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

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

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

Комментарии:

1. Вы можете просто выполнить замену(‘\’,’/’)

Ответ №1:

У шаблона есть String quote(String) функция, которая поможет вам для первой строки, а у средства сопоставления есть String quoteReplacement(String) для второй:

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

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

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

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

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

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

Комментарии:

1. Очень интересное решение. Мне это нравится. 1

2. Спасибо за эту работу, но replaceFirst — это базовый шаблон вызова.compile(regex).matcher(str).replaceFirst(repl)

3. 1 — Это правильное объяснение и правильное решение.

Ответ №2:

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

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

 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, они должны это сделать. Они просто пропускают их. Что касается причины, по которой они это делают, я все еще не уверен.

ПРАВКА2:Хорошо, прочитав документ для метода, вы получите ответы на все вопросы. Они делают это, чтобы соответствующим образом интерпретировать специальные символы. Таким образом, при чтении замены они обнаруживают косую черту, алгоритм предполагает, что это может быть частью специального символа, и в результате пропускает его.

             if (nextChar == '\') {
                cursor  ;
                nextChar = replacement.charAt(cursor);
                result.append(nextChar);
                cursor  ;
            } else if (nextChar == '$') {
                // Skip past $
                cursor  ;
  

Комментарии:

1. Спасибо, я нашел другой способ сделать это, мне просто немного любопытно, почему он это делает в первую очередь.

2. @K.T проверьте правку. Существует фрагмент кода из метода, который, я бы сказал, отвечает за это.

Ответ №3:

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

Комментарии:

1. ДА… это будет работать, но это не общее решение. Предположим, например, что он не хотел менять на / … или что он хотел изменить / на . Черт возьми, File(String) конструктор доволен смешанными и / в необработанных именах путей … он нормализуется к файловому разделителю по умолчанию.

2. Некоторые функции командной строки завершатся сбоем, если косая черта введена неправильно. Общее решение, которое я видел, — это проверить операционную систему и поменять местами по мере необходимости