2009-08-31 5 views
4

Поскольку VBScript не поддерживает lookbehinds, я ищу альтернативное решение.Регулярное выражение Отрицательный альтернативный вариант для VBScript

У меня есть строка '\ E \ F \'.

Я хочу заменить \ F \ на '~', но ТОЛЬКО, если ему не предшествует символ \ E.

После подстановки я хочу '\ E \ F \' быть '\ E \ F \'.

Если строка была «randomText \ F \», я хотел бы, чтобы она выглядела как «randomText ~» после замены.

Решение:

Я просто решил StrReverse его и сделать отрицательный вперед предпросмотр. Это не самое элегантное решение, но, похоже, оно работает в этом случае.

Dim regEx, str1 
str1 = StrReverse("The quick \F\ brown \E\F\ dog.") 
Set regEx = New RegExp 
regEx.IgnoreCase = True 
regEx.Pattern = "\\F\\(?!E\\)" 
regEx.Global = True 
ReplaceTest = regEx.Replace(str1, "%") 
+0

Различные библиотеки регулярных выражений имеют различный синтаксис. К чему вы кормите свои регулярные выражения? – moonshadow

ответ

8

VBScript doesn’t support look-behind assertions. Но попробуйте это:

(^.?|[^\\].|\\[^E])\\F\\ 

Или это:

(^.?|(?!\\E)..)\\F\\ 

Заменить матч с $1~ (первый SUBM atch и ~).

Вот объяснение: В общем, есть две ситуации: Если нет или только один символ до \F\ (^.?), все в порядке. Но если есть не менее двух символов до \F\, нам нужно убедиться, что эти символы не являются \E. Поэтому мы говорим, что два символа, предшествующих либо

  • любой символ, кроме \ следуют любой произвольный характер ([^\\].), или
  • \ следует любой символ, а затем E (\\[^E]).

Эта конструкция гарантирует, что допускается использование только всех других комбинаций, кроме \E.

То же самое относится ко второму выражению. Но здесь мы используем отрицательное выражение «смотреть вперед», чтобы гарантировать, что два символа до \F\ не являются \E.

+0

Быстрая \ F \ brown FF \ E \ F \ собака. Поворачивается в Quic ~ brown FF \ E \ F \ собака. – Chris

+0

@Chris: вам нужно заменить совпадение на первый подпункт и '~', поэтому '$ 1 ~'. – Gumbo

+0

Извините. Пропустил это. Кажется, они работают на первый взгляд. Позвольте мне попытаться расшифровать их и провести некоторое тестирование. Тогда я дам вам кредит. – Chris

0

вы хотите negative lookbehind

(?<!\\E)\\F\\ 
+0

Хотя я думаю, что вам нужно дополнительное \\ в конце –

+0

да, спасибо. обновлено. –

+3

Регулярные выражения VBScript (и JavaScript и JScript) не поддерживают lookbehind (http: // www.regular-expressions.info/vbscript.html). вы можете найти альтернативный googling для «VBScript Lookbehind». или изменить язык, который его поддерживает (http://www.regular-expressions.info/refflavors.html, поиск «Lookaround») –

0

не нужно использовать регулярное выражение. вот одно решение

strString = "The quick \F\ brown \E\F\ dog" 
s = Split(strString," ") 
For i=1 To UBound(s) 
    If Not InStr(s(i),"\E\F")> 0 And InStr(s(i),"\F") > 0 Then 
     s(i) = "~" 
    End If 
Next 
strFinal=Join(s," ") 
WScript.Echo strFinal 

выход

C:\test>cscript /nologo test.vbs 
The quick ~ brown \E\F\ dog 
Смежные вопросы