Поиск и замена внутри строки - PullRequest
2 голосов
/ 28 марта 2012

У меня есть строка, как показано ниже.

string data = "A := B;\nC:=D";

Строка должна быть заменена на оператор SET, как показано ниже.

data = "SET A=B;\nSET C=D"

Он должен заменить := на оператор = and insert a SET`.

Я разработал алгоритм, как показано ниже, но он не работает, когда у меня несколько :=.

Есть ли другой простой и эффективный способ справиться с этим? Возможно, используя RegEx?

private string AddSETStatement(string script)
{
        script = script.Replace(": =", ":=");
        script = script.Replace(":=", ":= ");
        script = script.Replace(" :=", ":= ");
        int found = script.IndexOf(":=");
        while (found > -1)
        {
            int foundspace = -1;
            for (int index = found; index >= 0; index--)
            {
                string temp = script.Substring(index, 1);
                if (temp == " ")
                {
                    foundspace = index;
                    break;
                }
            }
            script = script.Remove(found, 1);
            if (foundspace == -1)
            {
                script = "SET " + script;
            }
            else
            {
                script = script.Insert(foundspace, " SET ");
            }
            found = script.IndexOf(":=");
        }

        return script.Trim();
}

Любая помощь будет оценена.

Ответы [ 3 ]

1 голос
/ 28 марта 2012

Я проверил это, и я думаю, что это команда, которая соответствует вашему требованию, поскольку вы закодировали свой алгоритм (который можно заменить одной строкой кода):

script = System.Text.RegularExpressions.Regex.Replace(script, 
     @"([A-Z]{1})[\s]{0,1}:[\s]{0,1}=[\s]{0,1}([A-Z]{1})", "SET $1=$2", 
     System.Text.RegularExpressions.RegexOptions.Multiline);

На всякий случайвы фактически используете более одного пробела между и вокруг: = вы можете использовать это вместо:

script = System.Text.RegularExpressions.Regex.Replace(script,
     @"([A-Z]{1})[\s]*:[\s]*=[\s]*([A-Z]{1})", "SET $1=$2", 
     System.Text.RegularExpressions.RegexOptions.Multiline);

Это превращает это:

A := B;
C:=D
    E: =F
G : = H
  I   :   =   K;

В это:

SET A=B;
SET C=D
    SET E=F
SET G=H
  SET I=K;

И еще одно, которое обрабатывает имена переменных, которые имеют верхний и нижний регистр и содержат числа:

script = System.Text.RegularExpressions.Regex.Replace(script,
     @"([A-Za-z0-9]+)[\s]*:[\s]*=[\s]*([A-Za-z0-9]{1})", "SET $1=$2", 
     System.Text.RegularExpressions.RegexOptions.Multiline);

Превращает это:

Alpha1 := Bravo2;
Char3le:=Delta9
    E1ch3: =Foxt343
golf : = h1
  I3   :   =   k;

В:

SET Alpha1=Bravo2;
SET Char3le=Delta9
    SET E1ch3=Foxt343
SET golf=h1
  SET I3=k;

По крайней мере один из них или их комбинация должны выполнить эту работу за вас.

0 голосов
/ 28 марта 2012

Вот пример с довольно «строгим» регулярным выражением:

Regex.Replace("A := B;\nC:=D", 
  @"(?<=(;|^)(\n|\s)*)(?<var1>\w+)\s*:=\s*(?<var2>\w+)\s*(?=;|$)",
  "SET $1=$2",
  RegexOptions.ExplicitCapture)

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

(?<=  # after: 
    (;|^)     # a semicolon or the start of the string
    (\n|\s)*) # and optional whitespace/newlines

(?<var1>\w+) # variable name - capture it into group "var1"
\s*          # optional whitespace
:=           # ":="
\s*          # optional whitespace
(?<var2>\w+) # second variable - capture it into group "var2"
\s*          # optional whitespace

(?=   # followed by:
    ;|$)  # either a semicolon or the end of the string
0 голосов
/ 28 марта 2012

Очень просто ...

data = System.Text.RegularExpressions.Regex.Replace(data, "(^|\\n)", "$1SET ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...