用其他字符串替换多个标记

时间:2014-10-23 20:35:42

标签: c# replace

我正在将FoxPro转换为C#,并且很难理解如何拆分变量。我的身体里面有需要交换的词语,这些词语在"〜"内。例如,"〜这~~#34;。是否有一个C#equivelent FoxPro的At()?代码如下:

lnxx = At("~",lc_body,1)
        If lnxx = 0
            *--paste rest into new body
            lc_newbody = lc_newbody + lc_body
            Exit
        Endif

        *--get ending one
        lnyy = At("~",lc_body,2)



        *--get string out
        lc_string = Substr(lc_body,lnxx,lnyy-lnxx+1)


        *--remove ~
        lc_string = Strtran(lc_string,"~","")


        *--get part to ~, past in new one
        If lnxx>1
            lc_substring = Substr(lc_body,1,lnxx-1)
            lc_newbody = lc_newbody + lc_substring
            *-cut to second ~
            lc_body = Substr(lc_body,lnyy+1,5000)
        Else
            *--it starts with ~, handle this case
            ***newbody is blank
            lc_newbody = ""
            *-cut to second ~
            lc_body = Substr(lc_body,lnyy+1,5000)
        Endif

3 个答案:

答案 0 :(得分:1)

C#可以在更少的空间内完成更多工作。语言充满了实用功能。

我自己从未使用过Foxpro,但我认为我基于我在网上找到的评论和文档了解上述代码。正如@HighCore建议的那样,惯用的C#将为您提供更多可读性和更高的可读性。可维护的代码。

您展示的这一特定细分可以简单地表达为:

var parts = lc_body.Split(new[] { '~' }, 3);

if (parts.Length == 1)
{
  lc_newbody += lc_body;
  return; // <-- Is this what the Foxpro 'Exit' statement is doing?
}
else // We assume parts.Length == 3, as that is what the original code did
{
  // If lc_body starts with ~, then lc_newbody is cleared, otherwise we append the first part.
  if (parts[0] != "")
    lc_newbody += parts[0];
  else
    lc_newbody = "";

  lc_string = parts[1];

  lc_body = parts[2];
}

要解释一些细微差别:

  • .Split方法可以分配任意数量的字符。此代码传入一个只包含一个字符的数组。如果您不需要任何其他参数(例如path.Split('/', '\\')),C#实际上可以为您构建该数组,但我们在这里使用第二个参数。
  • 第二个参数&#34; 3&#34;给出了要拆分字符串的部分的上限。如果省略它,它将继续拆分,直到整个字符串被拆分。由于此代码似乎假设字符串后面可能会进一步倾斜,但我将其设置为3,以便lc_body变量可以设置为字符串的其余部分以供进一步处理。
  • 即使.Split方法为空,它也会返回部分;在"~foo~bar"上拆分'~'将生成一个包含三个字符串的数组,其中第一个字符串为"",即空字符串。

要批评这一点,除了注意到如果字符串中有一个奇数个波浪号会产生错误,我注意到如果lc_body不包含任何波形符,那么lc_string会没有被清除,lc_body没有被清除,即使它显然被完全消耗在lc_newbody中。我猜测还有更多代码 - 循环和实际利用lc_string中值的代码。

您还应该查找string&n IndexOfLastIndexOf函数,string.Joinstring.IsNullOrEmpty静态方法{{{{{{ 1}}用于将复杂的一系列片段放在一起,等等。如果这段代码正在进行大量的字符串操作,那么它们会非常方便。 : - )

<小时/> 编辑:根据您在评论中的描述,您可以使用以下代码大大简化整个过程。它的工作原理是,如果你有多个插入点,在tilde字符上拆分整个字符串将意味着数组中的每个其他元素都将是一个插入点 - 例如{{1将给出数组string.Format。因此,您可以浏览该数组并仅在每个第二个元素上进行替换,然后将结果全部重新组合在一起:

"Plain text ~first~ more text ~second~ a bit more"

答案 1 :(得分:1)

您似乎遇到了XY Problem

  

XY问题是询问您尝试的解决方案而不是实际问题。

     

也就是说,你正在尝试解决问题X,并且你认为解决方案Y会起作用,但是当你遇到麻烦时,不要询问X,而是询问Y.

解决您手头的问题:

  

我的身体里面有需要交换的词语,这些词语在&#34;〜&#34;之内。例如,&#34;〜这~~#34;。

这与如何无关,它可以通过FoxPro中的任何可用方法解决。

要替换另一个字符串值中的字符串值,只需使用String.Replace

DotNetFiddle Example和代码:

使用System;

public class Program
{
    public static void Main()
    {
        var originalText = "~this~ is a sentence that contains ~this~ more than once.";

        Console.WriteLine(originalText);

        var replacedText = originalText.Replace("~this~", "~that~");

        Console.WriteLine(replacedText);
    }
}

结果:

  

〜这〜是一个包含〜this~不止一次的句子。

     

〜那个〜是一个包含〜那个〜不止一次的句子。

如果您可以控制源文本,那么强烈建议您改用String.Format()

DotNetFiddle Example和代码:

using System;

public class Program
{
    public static void Main()
    {
        var originalText = "{0} is a sentence that contains {0} more than once.";

        Console.WriteLine(originalText);

        var replacedText = string.Format(originalText, "~that~");

        Console.WriteLine(replacedText);
    }
}

结果:

  

{0}是一个多次包含{0}的句子。

     

〜那个〜是一个包含〜那个〜不止一次的句子。

关于String.Format()的好处是,如果找不到替换的替换,则没有例外,它只是不替换任何东西。这解决了具有多个替换语句的问题,而是仅依赖于单个方法:

DotNetFiddle Example和代码:

using System;

public class Program
{
    public static void Main()
    {
        var originalText = "{0} should be [this], and {2} should be [that], and there should be no [thus]";

        Console.WriteLine(originalText);

        var replacedText = string.Format(originalText, "this", "thus", "that");

        Console.WriteLine(replacedText);
    }
}

结果:

  

{0}应该是[this],{2}应该是[那个],并且应该没有[因此]

     

这应该是[this],那应该是[那],而且应该没有[因此]

答案 2 :(得分:0)

String.IndexOf会为您提供字符串中字符的位置。 String.Split会将分隔的字符串拆分为一系列字符串。