2010-07-06 6 views
0

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

PRINT '.. Результат [ядра] [DBO] [функции х] + [ядро]. [dbo]. [FunctionX] + '.'

EXECUTE [ядро] [DBO] [функции х]

Результат Шоуда быть:... Результат [ядра] [DBO] [функции х].

ПЕЧАТЬ + [extended]. [dbo]. [FunctionX] + '.'

ВЫПОЛНИТЬ [расширенный]. [DBO]. [Функции х]

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

С RegLove

Кевин

ответ

0

Не в один шаг, а не в обычном текстовом редакторе. Если ваш 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. 
0

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

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

See it in action

+0

"' PRINT 'Результат ['] [core]. [Dbo]. [FunctionX] '' '+ [core]. [Dbo]. [FunctionX] +'. ' EXECUTE [core]. [Dbo]. [FunctionX] '"? – Tomalak

+0

Вы потрудились нажать на ссылку? Потому что я не знаю, где вы копируете свой результат ... Существует рабочий пример. Пойди и посмотри. – galambalazs

+0

Вы потрудились попробовать строку, которую я разместил? ;-) Потому что это не работает, эта строка. – Tomalak