регулярное выражение для преобразования поиска экземпляров одного \ - PullRequest
0 голосов
/ 03 марта 2010

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

Мне нужно что-то вроде:

any-non-\ followed by \ followed by any-non-\

В конечном счете, я передам регулярное выражение в java.lang.String.replace. Все, поэтому форматированное для этого регулярное выражение было бы здорово, но я, вероятно, могу перевести другое регулярное выражение в то, что мне нужно.

Например я после этой программы распечатал "true" ...

public class Main
{
    public static void main(String[] args)
    {
        final String original;
        final String altered;
        final String expected;

        original = "hello\nworld";
        expected = "hello\\nworld";
        altered  = original.replaceAll("([^\\\\])\\\\([^\\\\])", "$1\\\\$2");
        System.out.println(altered.equals(expected));
   }
}

использование этого действительно работает:

    altered  = original.replaceAll("\\n", "\\\\n");

Ответы [ 4 ]

2 голосов
/ 03 марта 2010

Строка должна быть

"[^\\\\]\\\\[^\\\\]"

Вы должны четырехкратные обратные слэши в константе String, которая предназначена для регулярных выражений; если вы только удвоите их, они будут спасены для строки, но не для регулярного выражения.

Таким образом, фактический код будет

myString = myString.replaceAll("([^\\\\])\\\\([^\\\\])", "$1\\\\$2");

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

Редактировать: Выше предполагалось, что во входной строке был литерал \n, который представлен в строковом литерале как "\\n". Поскольку он, очевидно, имеет вместо этого новую строку (представленную как "\n"), правильная подстановка будет

myString = myString.replaceAll("\\n", "\\\\n");

Это необходимо повторить для любых других специальных символов (\t, \r, \0, \\ и т. Д.). Как и выше, строка замены выглядит точно так же, как строка регулярного выражения, но не так.

1 голос
/ 03 марта 2010

То есть, когда есть 1 обратная косая черта, вы хотите 2, но если в строке 2, 3 или 4 ... оставьте их в покое?

вы хотите заменить

(?<=[^\\])\\(?!\\+)([^\\])

с

\\$1

Изменяет строку

hello\nworld and hello\\nworld and hello\\\nworld

в

hello\\nworld and hello\\nworld and hello\\\nworld
0 голосов
/ 04 марта 2010

Что не так с использованием altered = original.replaceAll("\\n", "\\\\n");? Это именно то, что я бы сделал.

0 голосов
/ 03 марта 2010

Я не знаю точно, зачем вам это нужно, но вы можете взглянуть на StringEscapeUtils из Commons Lang У них есть множество методов, делающих подобные вещи, и если вы не найдете именно то, что ищете, вы можете взглянуть на источник, чтобы найти вдохновение:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...