2011-10-31 7 views
1

Je suis après une solution simple pour citer le texte dans une chaîne de guillemets.Enclose des mots spécifiques avec guillemets simples

Par exemple:

DATEDIFF(Minutes, Lead.WhenCreated, @Today) 

être mis à jour à

DATEDIFF(Minutes, Lead.WhenCreated, '@Today') 

Si la chaîne source est a déjà guillemets pour le jeton alors aucun changement ne devrait être faite. Il peut y avoir plusieurs jetons dans la chaîne et je ne saurai pas quelle sera la valeur du jeton - seulement pour dire qu'elle commencera avec le caractère @.

Mon environnement est Visual Studio C# 2008.

Espoir certains peuvent aider.

Merci.

Répondre

0

Motif:

(?<!')(@\w+) 

remplacement:

'$1' 
+0

Merci Alexey, cela fonctionne aussi en plus de la réponse de FailedDev. – dubs

1
resultString = Regex.Replace(subjectString, @"(@\b\w+\b)", "'$1'"); 

Vous pouvez utiliser celui-ci. Il trouvera tous les mots commençant par @ et ajouter des guillemets.

Edit:

resultString = Regex.Replace(subjectString, @"((?<!')@\b\w+\b)", "'$1'"); 

Pour tenir compte des chaînes déjà citées.

+0

Cheers, fonctionne un régal. – dubs

+0

Un petit problème, si la chaîne source contient des guillemets (par exemple DATEDIFF (Heures, Lead.WhenCreated, '@Today')) alors le remplacement a toujours lieu: le résultat est: DATEDIFF (Heures, Lead.WhenCreated, '' @Today '') – dubs

+0

@JDubs voir la mise à jour de la réponse. – FailedDev

0

Il semble que vous construisiez une instruction SQL en code C# et que vous remplaciez les paramètres vous-même. Vous êtes probablement mieux d'utiliser cette méthode ...

DataReader rdr; 
using (SqlConnection con = new SqlConnection(MY_CONNECTIONSTRING) 
{ 
    con.Open(); 
    string sql = "SELECT DATEDIFF(Minutes, Lead.WhenCreated, @Today) FROM tbl"; 
    using (SqlCommand cmd = new SqlCommand(sql, con)) 
    { 
     cmd.Parameters.AddWithValue("@Today", datDateValue); 
     rdr = cmd.ExecuteReader(); 
    } 
} 

Cette méthode est plus sûre contre l'injection SQL malveillante.

This is an article addressing the issue in C#

+0

Salut El Ronnoco, je comprends votre point mais tout le remplacement sera effectué par le serveur de base de données car le sql sera exécuté par un planificateur (ie à un temps indéterminé) - donc la valeur réelle ne sera pas connue avant l'exécution du SQL . Point pris à propos de SQL Injection, je suis familier avec cela, mais aussi vérifier votre lien. – dubs

+0

@J Dubs Je pensais que votre application était probablement intrinsèquement sécurisée par injection, mais c'est une bonne habitude à prendre, par exemple votre code peut être copié dans un WebService ou une application Web par quelqu'un d'autre et avant que vous le sachiez, bing-bada-boom , [petites tables de bobby] (http://xkcd.com/327/) est en train de jeter votre backend :) –

Questions connexes