改变字符串的中间部分

时间:2011-12-06 18:30:29

标签: c# regex string replace

我有一个字符串列表..每个字符串看起来类似于:

"\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)...."

我要做的是保留整个字符串但是......替换DATETIMEComponentQty .....

我想放置我为 DATE 设置的date变量,以及 TIME DateTime.Now.ToString(""HH:mm:ss")。 。和 ComponentQty dictionary[part]。这些值会像这样取代:

"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,但我不太确定如何去做这件事。有人可以帮忙吗?

编辑:

我只使用了一个普通的字符串替换来做..但替换的数据并不总是具有 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);

我正在尝试为正则表达式设置一个值并且不确定如何这样做...这就是我正在尝试的...但它显然不起作用,因为var不是{ {1}}。有什么建议吗?

string

3 个答案:

答案 0 :(得分:3)

试试这个:

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)....

顺便说一句,你的输入字符串中有一个错误转义的点。干杯,玩得开心! :)

答案 1 :(得分:0)

如果你可以改变源字符串的外观,我会使用String.Format:

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

占位符{0},{1},{2}将替换为后面的指定参数。

答案 2 :(得分:0)

为了使它更清晰,我将创建一个函数来解析该字符串列表,然后创建另一个函数来创建这样的字符串列表而不是使用正则表达式。我认为这将使您的代码更易于维护。

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);
}