为什么这个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 "";
}
}
谢谢,伙计们。
你的代码没有确保开始和结束顺序。
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应用程序中的主循环)。