Regex для замены одиночных обратных косых черт, за исключением тех, за которыми следуют определенные символы - PullRequest
6 голосов
/ 22 февраля 2011

У меня есть выражение регулярного выражения, которое удаляет все обратные косые черты из строки, если за ними не следует ни один из следующих символов: \ / или}.

Это должно повернуть эту строку:

foo\bar\\batz\/hi

В это:

foobar\\batz\/hi

Но проблема в том, что он имеет дело с каждым обратным слешем по мере его продвижения.Таким образом, оно следует правилу в том смысле, что оно удаляет первый обратный слеш и игнорирует второй, потому что за ним следует еще один обратный слеш.Но когда он достигает 3-го, он удаляет его, потому что за ним не следует другой.

Мой текущий код выглядит так: str.replace(/\\(?!\\|\/|\})/g,"")

Но полученная строка выглядит следующим образомэто: foobar\batz\/hi

Как мне получить, чтобы пропустить третий обратный слеш?Или это случай явного отрицательного поиска и замены типа?Например.заменить '\', но не заменять '\\', '\ /' или '\}'?

Пожалуйста, помогите!:)

РЕДАКТИРОВАТЬ

Извините, я должен был объяснить - я использую javascript, поэтому я не думаю, что могу делать негативные взгляды...

Ответы [ 3 ]

6 голосов
/ 22 февраля 2011

Вам необходимо остерегаться обратной косой черты, за которой следует одиночная обратная косая черта.Или лучше: неравномерное количество последовательных обратных слешей.В этом случае вам нужно сохранить четное количество обратных косых черт в целости и заменить только последний (если за ним не следует / или {).

Это можно сделать с помощью следующего регулярного выражения:

(?<!\\)(?:((\\\\)*)\\)(?![\\/{])

и замените его на:

$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 - четное (или нулевое) число обратных слешей послена символ без обратной косой черты.

2 голосов
/ 22 февраля 2011

Требуемое регулярное выражение так же просто, как \\.

Вы должны знать, однако, что второй аргумент replace() может быть функцией, подобной этой:

result = string.replace(/\\./g, function (ab) { // ab is the matched portion of the input string
    var b = ab.charAt(1);
    switch (b) { // if char after backslash
    case '\\': case '}': case '/': // ..is one of these
        return ab; // keep original string
    default: // else
        return b; // replace by second char
    }
});
0 голосов
/ 22 февраля 2011

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

(?<![\\])[\\](?![\\\/\}]) какваше регулярное выражение

...