2

В ячейке A1 листа Excel у меня есть следующее содержимое внутри ячейки:

select a.id, b.type, c.name 
from blah a, 
blah2 b, 
blah3 c
where a.id = b.key
and b.key = c.id
;

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

select 1 from
blah a, 
blah2 b, 
blah3 c
where a.id = b.key
and b.key = c.id
;

ИЛИ ЖЕ

select 1
from blah a, 
blah2 b, 
blah3 c
where a.id = b.key
and b.key = c.id
;

У меня есть этот код VBA

    Dim objRegExp As New RegExp
    objRegExp.Pattern = "select .+ from"
    objRegExp.Global = True
    objRegExp.MultiLine = True
    regexpReplace =objRegExp.Replace(Trim(Worksheets("new").Range("A1").Value),"select 1 from")
MsgBox regexpReplace

Но в окне сообщения отображается точный текст из ячейки A1 (т.е. замена не производится). Кто-нибудь знает, почему это происходит? Я не смог бы заменить через мультилинии.

Я знаю, что мой код регулярного выражения в порядке, потому что я попытался изменить ячейку A1 на приведенную ниже (и она произвела замену правильно):

select a.id, b.type, c.name from
blah a, 
blah2 b, 
blah3 c
where a.id = b.key
and b.key = c.id
;

3 ответа3

4

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

Пытаться:

select.+\n*from

Или, может быть:

select.+\r\n*from

Даже лучше:

select[\s\S]+from

Также:

select[\u0000-\uFFFF]+from

Первые два означают совпадение всего, кроме новых строк, а также соответствия новых строк в определенной позиции. Последние два значения соответствуют всему, включая переводы строк.

4

Попробуйте с этим регулярным выражением

select (.*?)[\r\n|\s]from
2

Есть две проблемы:

  1. Шаблон регулярного выражения не соответствует Новой строке (как уже упоминали другие): используйте
    objRegExp.Pattern = "select\s.+\sfrom" ( \s для сопоставления пробелов, включая новые строки)
  2. Измените шаблон замены на "select 1" & vbNewLine & "from" чтобы вставить новую строку там, где вы хотите

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .