.Net Найти все смещения слова в строке - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть строка, которая может содержать что угодно, но 99% времени - это пара английских предложений.

Мне нужно взять эту строку и получить список индексов, которые представляют начало каждого слова (или, другими словами, в конце каждого куска пробела).Если требуется определение пробела, как минимум, Пробел, CR, LF и Период.

Какой самый простой способ сделать это?Я предполагаю, что есть лучший способ, чем цикл For - я думал об использовании лямбды, но не могу найти способ сделать это, который не был бы рекурсивным - и кажется, что он просит переполнения стека.

Пример данных:

Peter Piper picked a peck
of pickled peppers

Желаемый вывод - числа ниже.Комментарии рядом с иллюстрацией:

6,   'Peter '
12,  'Peter Piper '
19,  'Peter Piper picked '
21,  'Peter Piper picked a '
26,  'Peter Piper picked a peck[CR]'
29,  'Peter Piper picked a peck[CR]of '
37   'Peter Piper picked a peck[CR]of pickled '

Ответы [ 3 ]

2 голосов
/ 16 февраля 2012

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

var indices = Regex.Matches(inputString, @"[^\s\.]+")
                   .Cast<Match>()
                   .Select(match => match.Index)
                   .ToArray();
1 голос
/ 16 февраля 2012

Следующая функция делает то, что вам нужно без цикла for.Не уверен, что это на самом деле короче;)

static List<int> FindWordStarts(string sentence, Func<char, bool> is_separator) {

    var indexes = new List<int>();
    bool separator = true;

    sentence.Aggregate(
        0,
        (index, c) => {
            if (is_separator(c))
                separator = true;
            else if (separator) {
                indexes.Add(index);
                separator = false;
            }
            return ++index;
        }
    );

    return indexes;

}

Используйте это так:

string sentence = "Peter Piper picked a peck\rof pickled peppers";
var indexes = FindWordStarts(sentence, c => Char.IsWhiteSpace(c) || Char.IsPunctuation(c));
foreach (int index in indexes)
    Console.WriteLine(index);

И результат будет:

1 голос
/ 16 февраля 2012

Для этого случая лучше будет субъективно.Возможно, лучше с точки зрения «о, вау, я могу использовать одну строку кода», но, поскольку вам нужно знать индексы значения, простой цикл for можно было бы быстро написать и гораздо проще поддерживать.

Учитывая, что производительность O (n) должна быть достаточно хорошей для вашего случая, я бы сказал, просто перейдите к циклу for и перейдите к следующей проблеме.

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