2010-10-14 3 views
0

У меня есть строка:Regex Замена

users/554983490\/Another+Test+/Question????\/+dhjkfsdf/

Как бы я написать RegExp, который соответствовал бы всем прямым слешам НЕ предшествует обратный слеш?

EDIT: Есть ли способ сделать это, не используя отрицательные искажения?

+2

Какой язык вы используя для вашего RegExp? Есть много вкусов ... – gnarf

+0

Вы не можете сделать это надежно, даже с lookbehinds. Но если вы сообщите нам, что вы пытаетесь сделать, мы можем предложить другой подход. –

ответ

2

Если ваши регулярные выражения поддержки negative lookbehinds:

/(?<!\\)\// 

В противном случае, вы будете необходимость соответствовать характеру перед /, а:

/(^|[^\\])\// 

Это соответствует либо началу строки (^), либо (|) ничего, кроме \ ([^\\]) в качестве группы захвата # 1 (). Затем он соответствует буквам / после. Какой бы характер был до того, как / будет храниться в группе захвата $1, так что вы можете поместить его обратно, если вы делаете замену ....

Пример (JavaScript):

'st/ri\\/ng'.replace(/(^|[^\\])\//, "$1\\/"); 
// returns "st\/ri\/ng" 
+0

Да, но это включает в себя также и письмо –

+0

Отрицательный lookbehind не включает его ... Второй матч будет, но если вы не поддерживаете отрицательные lookbehinds, это ваш единственный вариант ... Вы можете сделать что-то вроде ' 'st/ri \\/ng'.replace (/ (^ | [^ \\]) \ //, "$ 1 \\ /"); 'в javascript, например, чтобы добавить обратную косую черту в любой'/', который дон У меня уже есть это. – gnarf

2

Вы можете использовать это:

/(?<!\\)\// 

Это называется negative lookbehind.

Я/как разделители

(?<! <-- Start of the negative lookbehind (means that it should be preceded by the following pattern) 
    \\  <-- The \ character (escaped) 
)  <-- End of the negative lookbehind 
\/  <-- The/character (escaped)