недопустимый escape-символ, за которым следует пробел

Я пишу немного кода для запуска сценария оболочки, используя процесс, который загружает и запускает файл в терминале. Проблема, с которой я сталкиваюсь, заключается в том, чтобы имя файла распознавалось терминалом из-за пробелов, например:

"$ ./run_file.sh foo bar.ss" 

должен быть запущен в терминале как

"$ ./run_file.sh foo\ bar.ss"

Вот код, чтобы изменить его, замените его:

JPanel panel1 = new JPanel();
JButton button = new JButton("Run");
button.setAlignmentX( Component.CENTER_ALIGNMENT);

button.addActionListener(new ActionListener(){

    public void actionPerformed(ActionEvent event){

        run();

    }

});
//button.setAlignmentX(0.5);
panel1.add(button);
panel1.add(Box.createVerticalGlue());
panel1.add(button);

menuB = new JMenuBar();

JMenu dropD = new JMenu("File");
menuB.add(dropD);

JMenuItem loadR = new JMenuItem("Load file");
JMenuItem quit = new JMenuItem("Quit");
dropD.add(loadR);
dropD.add(quit);
loadR.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent event) {
            JFileChooser fileopen = new JFileChooser();

            int r= fileopen.showDialog(panel, "Load file");

            if (r == JFileChooser.APPROVE_OPTION) {
                File file = fileopen.getSelectedFile();
                String string = file.toString();
                string = string.replaceAll(" ", "\ ");
                //String output = aa.replaceAll("/",Character.toString(File.separatorChar));
                System.out.println(string);
                loadFile = file;
        }

       }
  });

Меня пытались использовать String.replaceAll, но получаю

java:66: illegal escape character

я понимаю, что могу использовать File.separatorChar:

string = string.replaceAll(" ", Character.toString(File.separatorChar)+" ");

но это, кажется, ничего не заменяет... Любая помощь будет высоко оценена.

Спасибо


person schanq    schedule 02.03.2012    source источник


Ответы (2)


Если вы хотите поместить символ \ (который является escape-символом) внутри строки, вам нужно его экранировать:

string = string.replaceAll (" ", "\\ ");

Одиночный \ — это ведущий символ управляющей последовательности, например \n (новая строка) или \r (возврат каретки). Полный список односимвольных escape-последовательностей:

\b    backspace
\t    tab
\n    linefeed (newline)
\f    form feed
\r    carriage return
\"    double quote
\'    single quote
\\    backslash

Это в дополнение к восьмеричным escape-последовательностям, таким как \0, \12 или \377.

Причина, по которой ваше решение separatorChar не будет работать, заключается в том, что оно дает вам разделитель char (/ в UNIX и ее собратьях), а не управляющий символ \, который вам нужен.

person paxdiablo    schedule 02.03.2012

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

string = string.replaceAll(" ", "\\ ");

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

См. раздел 3.10.6 Спецификация языка Java для получения более подробной информации об escape-последовательностях символьных/строковых литералов.

person Jon Skeet    schedule 02.03.2012