Вам необходимо остерегаться обратной косой черты, за которой следует одиночная обратная косая черта.Или лучше: неравномерное количество последовательных обратных слешей.В этом случае вам нужно сохранить четное количество обратных косых черт в целости и заменить только последний (если за ним не следует /
или {
).
Это можно сделать с помощью следующего регулярного выражения:
(?<!\\)(?:((\\\\)*)\\)(?![\\/{])
и замените его на:
$1
, где первая группа совпадений - это первое четное число сопоставленных обратных косых черт.
Краткое объяснение:
(?<!\\) # looking behind, there can't be a '\'
(?:((\\\\)*)\\) # match an uneven number of backslashes and store the even number in group 1
(?![\\/{]) # looking ahead, there can't be a '\', '/' or '{'
На простом английском языке это будет выглядеть следующим образом:
соответствует неравному числу обратных косых черт, (?:((\\\\)*)\\)
, за которыми не следует \\
или {
или /
, (?![\\/{])
, и , перед которым не стоит обратная косая черта (?<!\\)
.
Демонстрация на Java (помните, что обратные косые черты являются двойными экранированными!):
String s = "baz\\\\\\foo\\bar\\\\batz\\/hi";
System.out.println(s);
System.out.println(s.replaceAll("(?<!\\\\)(?:((\\\\\\\\)*)\\\\)(?![\\\\/{])", "$1"));
, который будет печатать:
baz\\\foo\bar\\batz\/hi
baz\\foobar\\batz\/hi
РЕДАКТИРОВАТЬ
И решение, не требующее предварительного просмотра, будет выглядеть следующим образом:
([^\\])((\\\\)*)\\(?![\\/{])
изаменяется на:
$1$2
, где $1
- символ без обратной косой черты в начале, а $2
- четное (или нулевое) число обратных слешей послена символ без обратной косой черты.