Заменить, используя RegEx вне текстовых маркеров - PullRequest
0 голосов
/ 06 июля 2010

У меня есть следующий образец текста, и я хочу заменить «[core]».чем-то другим, но я хочу заменить его, только если он не находится между текстовыми маркерами '(SQL):

PRINT' Результат [core]. [dbo]. [FunctionX] '+ [core]. [dbo]. [FunctionX] + '.'

EXECUTE [core]. [dbo]. [FunctionX]

Результат будет:

PRINT 'Результат [core]. [Dbo]. [FunctionX]' + [extended]. [Dbo]. [FunctionX] + '.'

EXECUTE [extended]. [dbo]. [FunctionX]

Я надеюсь, что кто-то может это понять.Можно ли это решить с помощью регулярного выражения?

С RegLove

Кевин

Ответы [ 2 ]

0 голосов
/ 06 июля 2010

Вот решение (javascript):

str.replace(/('[^']*'.*)*\[core\]/g, "$1[extended]");

увидеть его в действии

0 голосов
/ 06 июля 2010

Ни в один шаг, и не в обычном текстовом редакторе.Если ваш SQL синтаксически допустим, вы можете сделать что-то вроде этого:

Сначала вы удалите каждую строку из SQL и замените ее заполнителями.Затем вы заменяете [core] чем-то другим.Затем вы восстанавливаете текст в заполнителях с первого шага:

  • Найдите все вхождения '(?:''|[^'])+' с 'n', где n - индексный номер (номер совпадения).Сохраните совпадения в массиве с тем же номером, что и n.Это удалит все строки SQL из входных данных и заменит их для безвредных замен без аннулирования самого SQL.
  • Замените [core].Регулярное выражение не требуется, здесь достаточно обычного поиска и замены.
  • Итерируйте массив, заменив заполнитель '1' на первый элемент массива, '2' на второй, до n.Теперь вы восстановили исходные строки.

Регулярное выражение объяснило:

'          # a single quote
(?:        # begin non-capturing group
  ''|[^']  #   either two single quotes, or anything but a single quote
)+         # end group, repeat at least once
'          # a single quote

JavaScript это будет выглядеть примерно так:

var sql = 'your long SQL code';
var str = [];

// step 1 - remove everything that looks like an SQL string
var newSql = sql.replace(/'(?:''|[^'])+'/g, function(m) { 
  str.push(m);
  return "'"+(str.length-1)+"'";
});

// step 2 - actual replacement (JavaScript replace is regex-only)
newSql = newSql.replace(/\[core\]/g, "[new-core]");

// step 3 - restore all original strings
for (var i=0; i<str.length; i++){
  newSql = newSql.replace("'"+i+"'", str[i]);
}

// done.
...