C# / Regex - замена набора совпадений другим набором совпадений - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь превратить эту строку:

INSERT INTO [main]. [Sqlite_default_schema]. [TableName] ( [SomeColumn], [SomeOtherColumn], [Last] ) ЗНАЧЕНИЯ ( @ param1, @ param2, @ param3 );

в этот:

INSERT INTO [main]. [ sqlite_default_schema]. [TableName] ([SomeColumn], [SomeOtherColumn], [Last]) VALUES ( @ SomeColumn, @SomeOtherColumn, @ Last );

как новичок в регулярное выражение, я использую этот C# фрагмент:

Regex regex = new Regex(@"\(.*?\)");
MatchCollection matches = regex.Matches(commandText);
if (matches[0].Success && matches[1].Success)
{
    Regex reColNames = new Regex(@"\[\w*\]");
    MatchCollection colNames = reColNames.Matches(matches[0].Value);
    Regex reParamNames = new Regex(@"\@\w*");
    MatchCollection paramNames = reParamNames.Matches(matches[1].Value);
    if (colNames.Count > 0 && colNames.Count == paramNames.Count)
    {
        for (int i = 0; i < paramNames.Count; i++)
        {
            string colName = colNames[i].Value.Substring(1, colNames[i].Length - 2);
            commandText = commandText.Replace(paramNames[i].Value, "@" + colName);
        }
    }
}
return commandText;

Это работает, но не кажется правильным. Есть ли способ достичь того же результата с помощью одного регулярного выражения?

Cheers!

1 Ответ

0 голосов
/ 14 февраля 2020

Мне кажется, вы заменяете весь текст "param" на "column". Почему бы не начать с этого в первую очередь? Если это невозможно из-за каких-то проблем, о которых вы не упомянули, см. Решение ниже.

Это приведет к массовой замене всего в одну строку.

Regex.Replace(query, "param", "column", RegexOptions.None);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...