2010-07-06 4 views
0

J'ai l'exemple de texte suivant et je veux remplacer '[core].' avec quelque chose d'autre, mais je ne veux que de le remplacer quand il est entre les marqueurs de texte '(SQL):Remplacer en utilisant RegEx en dehors des marqueurs de texte

PRINT.. Le résultat de [coeur] [dbo] [Yevol]' + [noyau]. [dbo]. [FunctionX] + '.'

EXECUTE [noyau] [DBO] [Yevol]

Le résultat devraient être:.. 'Le résultat de [noyau] [DBO] [Yevol].'

IMPRIMER + [étendu]. [dbo]. [FonctionX] + '.'

EXECUTE [étendu]. [Dbo]. [Yevol]

J'espère que quelqu'un peut comprendre cela. Cela peut-il être résolu par une expression régulière?

Avec RegLove

Kevin

Répondre

0

pas en une seule étape, et non dans un éditeur de texte ordinaire. Si votre SQL est syntaxiquement valide, vous pouvez faire quelque chose comme ceci:

D'abord, vous supprimez toutes les chaînes du SQL et les remplacez par des espaces réservés. Ensuite, vous faites votre remplacement de [core] avec autre chose. Ensuite, vous restaurer le texte dans les espaces réservés de la première étape:

  • Trouver toutes les occurrences de '(?:''|[^'])+' avec 'n', où n est un numéro d'index (le numéro du match). Stockez les correspondances dans un tableau portant le même numéro que n. Cela supprimera toutes les chaînes SQL de l'entrée et les échangera contre des remplacements sans danger sans invalider le SQL lui-même.
  • Remplacez-le par [core]. Aucune regex requise, la recherche et le remplacement normaux suffisent ici.
  • Itérer le tableau en remplaçant l'espace réservé '1' par le premier élément du tableau, '2' par le second, jusqu'à n. Vous avez maintenant restauré les chaînes d'origine.

Le regex, a expliqué:

 
'   # 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 cela ressemblerait à quelque chose comme ceci:

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

Voici une solution (javascript):

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

See it in action

+0

"' PRINT 'Le résultat de' '[core]. [Dbo]. [FunctionX]' '' + [noyau]. [Dbo]. [FunctionX] + '.' EXECUTE [noyau]. [Dbo]. [FonctionX] '"? – Tomalak

+0

Avez-vous pris la peine de cliquer sur le lien? Parce que je ne sais pas d'où vous copiez votre sortie de ... Il y a un exemple de travail. Allez le voir. – galambalazs

+0

Avez-vous pris la peine d'essayer avec la chaîne que j'ai posté? ;-) Parce que cela ne fonctionne pas cette chaîne. – Tomalak

Questions connexes