从一个字符串复制到另一个字符串时如何忽略字符 - c#

时间:2017-01-27 20:32:29

标签: c#

复制到另一个字符串时,如何忽略字符串中/ * * /之间的字符?

string str1 = "/*TODO:if*/";

如何忽略/ ** /之间的字符,新字符串将如下所示:

string str2 = "/**/";

我不允许使用任何库函数!

4 个答案:

答案 0 :(得分:1)

string str2 = Regex.Replace(str1, @"/\*.*\*/", "/**/");

使用正则表达式,您可以捕获/*[anything]*/的所有实例,并将其替换为您想要的文本:/**/。但是,这将非常贪婪。如果你有字符串/*foo*/bar/*baz*/,这将会吃掉所有字符串。

string str2 = Regex.Replace(str1, @"/\*.+?\*/", "/**/");

通过将其更改为惰性正则表达式,将返回字符串/**/bar/**/

鉴于上面的编辑,通过简单的索引搜索,这也可以在没有Regex的情况下完成 - 尽管它是一个贪婪的替代品。

string str2 = str1.Substring(0, str1.IndexOf("/*")) + "/*" + str1.Substring(str1.LastIndexOf("*/"));

这只是在第一个/*之前的所有内容,然后是最后一个*/之后的所有内容。

答案 1 :(得分:-1)

我不确定您是否可以使用库函数,因为所有函数本质上都是库函数。我认为这里的限制是你不能引入一个尚未在新项目中导入的库。没关系,我们可以做到这一点蹒跚。 Type string具有Split功能,并且我们可以将它弄脏并使用类似1995年的版本。我没有测试这些但是你应该和他们一起走好路。说实话,这是一个有趣的小练习。

鉴于:string str1 = "Stufftokeep/*TODO:if*/StufftokeepAgain";

 string[] crazyHomework = str1.Split('/');
 string result = string.Empty;
 foreach(string s in crazyHomework)
 {
    if(s.IndexOf('*') == -1)
       result += s + " ";  //added a space to keep them separate
 }

只使用System函数即可实现这一目标。如果做不到这一点,你可以将string变为array type char string {无论如何都是string result = string.Empty; bool copy = true; char[] array = str1.ToCharArray() foreach(char a in array) { int i = array.IndexOf[a]; if(a == "/" && array.IndexOf(a) != array.Length - 1 && (array[a + 1] == '*' || array[a -1] == '*')) { copy = !copy; } if(copy) result += a.ToString(); }

string

如果1.2em中没有空格,那么你会在那个问题上遇到一些空间问题。

答案 2 :(得分:-1)

尝试此代码( 不使用任何库函数):

static string FormatString(string str) =>
    RemoveAfter(str, "/*") + SubstringFrom(str, "*/");

static int IndexOf(string str, string value)
{
    for (int i = 0; i < str.Length - value.Length; i++)
    {
        bool found = true;

        for (int j = 0; j < value.Length; j++)
        {
            if (str[i + j] != value[j])
            {
                found = false;
                break;
            }
        }

        if (found)
        {
            return i;
        }
    }

    return -1;
}

static int LastIndexOf(string str, string value)
{
    for (int i = str.Length - value.Length; i >= 0; i--)
    {
        bool found = true;

        for (int j = 0; j < value.Length; j++)
        {
            if (str[i + j] != value[j])
            {
                found = false;
                break;
            }
        }

        if (found)
        {
            return i;
        }
    }

    return -1;
}

static string SubstringFrom(string str, string value)
{
    int startIndex = LastIndexOf(str, value);

    int length = str.Length - startIndex;
    char[] result = new char[length];

    for (int i = 0; i < length; i++)
    {
        result[i] = str[startIndex + i];
    }

    return new string(result);
}

static string RemoveAfter(string str, string value)
{
    int length = IndexOf(str, value) + value.Length;
    char[] result = new char[length];

    for (int i = 0; i < length; i++)
    {
        result[i] = str[i];
    }

    return new string(result);
}

答案 3 :(得分:-1)

快速而肮脏

string temp = null;
string str1 = "this shoudl remain/*TODO:if*/*/*testing again */-and so should this";
int x, y;
while ((x = str1.IndexOf("/*")) != -1)
{
    if ((y = str1.IndexOf("*/")) > x)
    {
        temp += str1.Substring(0, x + 2) + str1.Substring(y, 2);
        str1 = str1.Substring(y + 2);
        continue;
    }
    temp += str1.Substring(y, x);
    str1 = str1.Substring(x)
}
temp += str1;