Почему этот код C # не работает? Он должен возвращать строку между двумя другими строками, но всегда возвращает пустую строку - PullRequest
0 голосов
/ 29 сентября 2011

Название объясняет все это. Это кажется достаточно простым, поэтому я, должно быть, упускаю из виду нечто глупое. Вот что у меня есть.

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

Спасибо, ребята.

Ответы [ 3 ]

4 голосов
/ 29 сентября 2011

Ваш код не гарантирует, что начало и конец в порядке.

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
}
1 голос
/ 29 сентября 2011

Как говорили некоторые люди, проблема в том, что ваш код работает на очень специфических входных данных, это все из-за этого начала и конца.проблема в том, что ваш код стал очень длинным со многими индексами, сравнениями, подстроками, условиями и так далее.Чтобы избежать этого, я бы рекомендовал вам использовать регулярные выражения , с их помощью вы можете выразить то, что вам нужно, на специальном языке.

Вот пример, который решает вашу проблему с регулярными выражениями:

        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.

Надеюсь, это поможет.

1 голос
/ 29 сентября 2011

Я получу правильный ответ, если попробую любой из них:

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

Вы можете улучшитьВаше подтверждение проблемы, написав несколько тестовых примеров, подобных этим, в качестве отдельного приспособления (xUnit или основной цикл в одноразовом приложении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...