为什么这个c#代码不能工作?它应该返回两个字符串之间的字符串,但总是返回一个空字符串

本文关键字:字符串 返回 之间 一个 两个 工作 代码 为什么 不能 | 更新日期: 2023-09-27 18:09:55

标题说明了一切。这看起来很简单,所以我一定忽略了一些愚蠢的东西。这是我拿到的。

    private string getBetween(string strSource, string strStart, string strEnd)
    {
        int start, end;
        if (strSource.Contains(strStart) && strSource.Contains(strEnd))
        {
            start = strSource.IndexOf(strStart, 0) + strStart.Length;
            end = strSource.IndexOf(strEnd, start);
            return strSource.Substring(start, end - start);
        }
        else
        {
            return "";
        }
    }

谢谢,伙计们。

为什么这个c#代码不能工作?它应该返回两个字符串之间的字符串,但总是返回一个空字符串

你的代码没有确保开始和结束顺序。

static string SubString(string source, string prefix, string suffix)
{
    int start = source.IndexOf(prefix); // get position of prefix
    if (start == -1)
        return String.Empty;
    int subStart = start + prefix.Length; // get position of substring
    int end = source.IndexOf(suffix, subStart); // make sure suffix also exists
    if (end == -1)
        return String.Empty;
    int subLength = end - subStart; // calculate length of substring
    if (subLength == 0)
        return String.Empty;
    return source.Substring(subStart, subLength); // return substring
}

正如几个人说的问题,你的代码是工作在非常具体的输入,这都是因为这个开始和结束IndexOf魔术=),但是当你试图更新你的代码工作正确的更多的输入,你会遇到的问题,你的代码变得很长,有许多索引,比较,子字符串,条件等。为了避免这种情况,我建议你使用正则表达式,在他们的帮助下,你可以用特殊的语言表达你需要的东西。

下面是用正则表达式解决问题的示例:

        public static string getBetween(string source, string before, string after)
        {
            var regExp = new Regex(string.Format("{0}(?<needle>[^{0}{1}]+){1}",before,after));
            var matches = regExp.Matches(source).Cast<Match>(). //here we use LINQ to
                OrderBy(m => m.Groups["needle"].Value.Length).  //find shortest string
                Select(m => m.Groups["needle"].Value);          //you can use foreach loop instead
            return matches.FirstOrDefault();
        }

所有棘手的部分是{0}(?<needle>[^{0}{1}]+){1},其中0 -前字符串和1 -后字符串。这个表达式意味着我们需要找到介于0和1之间的字符串,并且不包含0和1。

如果我尝试以下任何一个,我都会得到正确的答案:

var a = getBetween("ABC", "A", "C");
var b = getBetween("TACOBBURRITO", "TACO", "BURRITO");
var c = getBetween("TACOBACONBURRITO", "TACO", "BURRITO");

问题可能与输入参数验证有关,因为这失败了:

var a = getBetween("ABC", "C", "A");
var a = getBetween("ABC", "C", "C");

你可以通过编写像这样的测试用例来改进问题的验证,作为一个单独的fixture (xUnit,或在throw away应用程序中的主循环)。