2013-04-24 2 views
0

Я пытаюсь выполнить замену. Рассмотрим следующую строку:Пробелы вокруг поиска при замене с помощью RegEx

Please replace something in this sentence. 
and replace <b>something&nbsp;</b> in this sentence. 
But not here http://www.mysite.com/something/mypage.html 
Or here \\myserver\something\myshare\ 

Я хочу заменить something с somethingelse, однако something может появиться в URL или UNC в мой источник, и я не хочу, чтобы заменить это. У меня также есть смешной HTML.

Это модель я использую:

\b[^/\\]Something[^/\\]\b 

Который работает, но я получаю пространство вокруг первого something спины, а также. Если я заменяю something с somethingelse я получаю результат:

Please replacesomethingelsein this sentence. 
and replace <b>somethingelse&nbsp;</b> in this sentence. 
But not here http://www.mysite.com/something/mypage.html 
Or here \\myserver\something\myshare\ 

Второй экземпляр работает, то первое с пробелами не делает.

Как я могу игнорировать наличие или отсутствие пробелов вокруг something? Спасибо.

+0

Разве вы не можете просто взять их с захватом групп и использовать их взамен? – Loamhoof

+0

Я пробовал '\ b [^/\\] (что-то) [^/\\] \ b', но не знал, как заменить только SubMatch. Это то, о чем вы думаете? – SLeepdepD

+0

См. Мой ответ на использование :) – Loamhoof

ответ

2

http://msdn.microsoft.com/en-us/library/k9z80300(v=vs.84).aspx

Итак:

ReplaceTest("\b([^/\\])Something([^/\\])\b", "$1SomethingElse$2") 

Примечание: Не включать поиск без учета регистра.

+0

Я проверил это. У вас обоих есть правильные решения - не уверен, что отметить как ответ :) – SLeepdepD

+1

@SLeepdepD Я думаю, что ответ Loamhoof более специфичен для VB, а мой более общий. Мое может помочь людям с проблемами, отличными от VB, схожими с вашими. Я бы назвал Loamhoof's, так как он ближе к границам, которые излагал оригинальный пост. :) – Walls

+0

@ Стоит очень милостиво вас :) Спасибо вам за вашу помощь – SLeepdepD

2

Что вы хотите сделать, это использовать look-behinds и look-ahead, поэтому ваше регулярное выражение должно выглядеть примерно так: \b(?<!/\\)something(?=[^/\\])\b.

Поскольку вы добавляете [^/\\] в регулярное выражение, это фактически соответствует символу перед «чем-то», и это включает его обратно в ответ, который вы заявляете, что не хотите. Если вы хотите подтвердить, что что-то есть или нет (вперед или назад), и на самом деле это не соответствует тем частям, на которые вы проверяете, вы можете использовать look-ahead и look-behinds для обработки этой проверки. Для получения дополнительной информации о перспективах и ожиданиях я использую this в качестве ссылки.

Вы можете увидеть тестирование, которое я сделал here with your example you provided..

РЕДАКТИРОВАТЬ: Look-behinds are not supported in VBScript, но кажется, что опережение поддерживается полностью. Поскольку регулярное выражение использует валидацию впереди и позади (что является избыточным), он все равно должен работать, используя только положительный прогноз (проверка состояния НЕ, которое вы указали): \bsomething(?=[^\/\\])\b.

+0

Я думаю, что 'vbscript' их не поддерживает. – Loamhoof

+0

@Loamhoof это правильно. любые другие идеи Стены? – SLeepdepD

+0

@SLeepdepD Я нашел некоторую документацию, в которой говорится, что внешний вид задержек не поддерживается, но надежные перспективы полностью поддерживаются. Я отредактировал ответ и добавил ссылку на эту находку. Ожидания впереди еще должно быть достаточно. Взгляд вперед - это «позитивный» взгляд вперед, соответствующий «негативному». «Позитивный» взгляд должен работать в VB. – Walls

Смежные вопросы