Изменение середины строки - PullRequest
2 голосов
/ 06 декабря 2011

У меня есть список строк .. каждая выглядит примерно так:

"\n\t\"BLOCK\",\"HEADER-\"\r\n\t\t\"NAME\",\"147430\"\r\n\t\t\"REVISION\",\"0000\"\r\n\t\t\"DATE\",\"11/11/10\"\r\n\t\t\"TIME\",\"10:03:47\"\r\n\t\t\"PMABAR\",\"\"\r\n\t\t\"COMMENT\",\"\"\r\n\t\t\"PTPNAME\",\"0805C\"\r\n\t\t\"CMPNAME\",\"0805C\"\r\n\t\"BLOCK\",\"PRTIDDT-\"\r\n\t\t\"PMAPP\",1\r\n\t\t\"PMADC\",0\r\n\t\t\"ComponentQty\",4\r\n\t\"BLOCK\",\"PRTFORM-\"\r\n\t\t\....(more)...."

Что я пытаюсь сделать, так это сохранить всю строку НО ... заменить DATE, TIME и ComponentQty .....

Я хочу разместить переменную date, которую я установил для ДАТА , а также DateTime.Now.ToString(""HH:mm:ss") для ВРЕМЯ ... и dictionary[part] для ComponentQty . Эти значения заменили бы так:

"DATE","11/11/10"   with  "DATE","12/06/11"
"TIME","10:03:47"   with  "TIME","10:30:10"
"ComponentQty",4    with  "ComponentQty", 8

или что-то подобное ...

новая строка будет выглядеть так:

"\n\t\"BLOCK\",\"HEADER-\"\r\n\t\t\"NAME\",\"147430\"\r\n\t\t\"REVISION\",\"0000\"\r\n\t\t\"DATE\",\"12/06/11\"\r\n\t\t\"TIME\",\"10:30:10"\"\r\n\t\t\"PMABAR\",\"\"\r\n\t\t\"COMMENT\",\"\"\r\n\t\t\"PTPNAME\",\"0805C\"\r\n\t\t\"CMPNAME\",\"0805C\"\r\n\t\"BLOCK\",\"PRTIDDT-\"\r\n\t\t\"PMAPP\",1\r\n\t\t\"PMADC\",0\r\n\t\t\"ComponentQty\",8\r\n\t\"BLOCK\",\"PRTFORM-\"\r\n\t\t\....(more)...."

Какой самый быстрый способ сделать это? Я думал о Regex, но я не слишком уверен, как это сделать. Кто-нибудь может помочь?

EDIT:

Для этого я использовал обычную замену строки ... но замененные данные не всегда будут иметь statc дату, время и время, указанные ниже (11/11/10, 10:03 : 47, 4) ... Мне нужно найти способ сделать этот раздел не жестко запрограммированным - с регулярным выражением, я предполагаю ..

var newDate = "DATE\",\"" + date + "\"";
var newTime = "TIME\",\"" + DateTime.Now.ToString("HH:mm:ss") + "\"";
var newCompQTY = "ComponentQty\"," + dictionary[part];

trimmedDataBasePart = trimmedDataBasePart.ToUpper().Replace("DATE\",\"11/11/10", newDate);
trimmedDataBasePart = trimmedDataBasePart.ToUpper().Replace("TIME\",\"10:03:47", newTime);
trimmedDataBasePart = trimmedDataBasePart.ToUpper().Replace("COMPONENTQTY\",4", newCompQTY);

Я пытаюсь установить значение для Regex и не уверен, как это сделать ... это то, что я пытался ... но это, очевидно, не работает, потому что var не является string , есть предложения?

var newDate = "DATE\",\"" + date + "\"";
var regexedDate = Regex.Match(trimmedDataBasePart, "DATE\",[0-9]+/[0-9]+/[0-9]+");
trimmedDataBasePart = trimmedDataBasePart.ToUpper().Replace(regexedDate, newDate);

Ответы [ 3 ]

3 голосов
/ 06 декабря 2011

Попробуйте это:

resultString = Regex.Replace(subjectString, @"(.*\bDATE\b\D*).*?(\\.*\bTIME\b\D*).*?(\\.*\bComponentQty\b\D*)\d+(.*)", "$1NEW_DATE$2NEW_TIME$3NEW_QTY", RegexOptions.Singleline);

Где NEW_DATE должен быть заменен вашей датой, NEW_TIME - вашим временем, а NEW_QTY - вашим новым кол-во.

Вы можете создать заменяющую строку из других переменных по своему усмотрению:)

Ну, хорошо. NET и интерполированные переменные - отстой. Если вы пытаетесь изменить, используйте "$ 11" вместо негодумает, что он должен использовать обратную ссылку # 11, и это не удается.Кроме того, в Regexbuddy была ошибка, приводившая к неправильному регулярному выражению.Это проверено и работает!

string subjectString = "\n\t\"BLOCK\",\"HEADER-\"\r\n\t\t\"NAME\",\"147430\"\r\n\t\t\"REVISION\",\"0000\"\r\n\t\t\"DATE\",\"11/11/10\"\r\n\t\t\"TIME\",\"10:03:47\"\r\n\t\t\"PMABAR\",\"\"\r\n\t\t\"COMMENT\",\"\"\r\n\t\t\"PTPNAME\",\"0805C\"\r\n\t\t\"CMPNAME\",\"0805C\"\r\n\t\"BLOCK\",\"PRTIDDT-\"\r\n\t\t\"PMAPP\",1\r\n\t\t\"PMADC\",0\r\n\t\t\"ComponentQty\",4\r\n\t\"BLOCK\",\"PRTFORM-\"\r\n\t\t....(more)....";
            Regex regexObj = new Regex(@"^(.*\bDATE\b\D*).*?(\"".*?\bTIME\b\D*).*?(\"".*?\bComponentQty\b\D*)\d+(.*)$", RegexOptions.Singleline);

            StringBuilder myResult = new StringBuilder();
            Match matchResults = regexObj.Match(subjectString);
            while (matchResults.Success)
            {
                for (int i = 1; i < matchResults.Groups.Count; i++)
                {
                    Group groupObj = matchResults.Groups[i];

                    if (groupObj.Success)
                    {
                        myResult.Append(groupObj.Value);
                        switch (i)
                        {
                            case 1:
                                myResult.Append("NEW_DATE");
                                break;
                            case 2:
                                myResult.Append("NEW_TIME");
                                break;
                            case 3:
                                myResult.Append("NEW QTY");
                                break;
                        }
                    }
                }
                matchResults = matchResults.NextMatch();
            }
            Console.WriteLine("Final Result : \n\n\n{0}", myResult.ToString());

Вывод:

Final Result :



        "BLOCK","HEADER-"
                "NAME","147430"
                "REVISION","0000"
                "DATE","NEW_DATE"
                "TIME","NEW_TIME"
                "PMABAR",""
                "COMMENT",""
                "PTPNAME","0805C"
                "CMPNAME","0805C"
        "BLOCK","PRTIDDT-"
                "PMAPP",1
                "PMADC",0
                "ComponentQty",NEW QTY
        "BLOCK","PRTFORM-"
                ....(more)....

Кстати, у вас есть ложно экранированная точка во входной строке.Ура и веселись!:)

0 голосов
/ 06 декабря 2011

Чтобы сделать его чище, я бы создал функцию для анализа этого списка строк, а затем другую функцию для создания такого списка строк вместо использования регулярных выражений. Я думаю, это облегчит поддержку вашего кода.

Dictionary<string, string> Parse(List<string> data)
{
    ...
}

List<string> CreateStringList(Dictionary<string, string> values)
{
    ...
}

List<string> SetValues(List<string> data)
{
    Dictionary<string, string> values = Parse(data);
    values["DATE"] = "12/06/11";
    values["TIME"] = "10:30:10";
    values["ComponentQty"] = "4";
    return CreateStringList(values);
}
0 голосов
/ 06 декабря 2011

Если вы можете изменить внешний вид вашей исходной строки, я бы использовал String.Format:

string s = String.Format("Date={0}, Name={1}, Quantity={2}", date, name, quantity);

Заполнители {0}, {1}, {2} заменяются указанными аргументами, которыеследовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...