Для создания алгоритма выборки слов следует, прежде всего, определить, что такое слово. Возможны три определения:
1. Последовательность символов, не являющихся пробелами окруженная пробелами слева и справа. Например, в фразе "This is string" " "is" считаются словами согласно этому определению, так как он окружен символами пробела слева и справа.
2. Последовательность символов, не являющихся пробелами окруженная:
• началом текста слева
• символом пробела справа
В нашей фразе словом считается "This".
3. Последовательность непустых символов, окруженная:
• символом пробела слева
• концом текста справа
В нашей фразе словом считается "string".
Эти определения включают все возможные подстроки текста, которые считаются словами. Имея определение слова, можно перейти к разработке алгоритма.
Основная стратегия алгоритма заключается в применении двух переменных в качестве маркеров текста: wordBegin и wordEnd. Каждая переменная содержит индекс отдельного символа строки. Для иллюстрации возможностей маркеров рассмотрим следующую строку:
|
|
string myText = "This is string";
Разумеется, строку myText можно рассматривать как индексированный набор символов:
T | H | I | S | I | S | S | T | R | I | N | G |
Присваивая маркерам wordBegin и wordEnd допустимые значения, можно:
• обращаться к отдельным символам (посредством квадратных скобок []) строки:
char ch;
wordEnd = 8;
ch = myText[wordEnd];
(здесь переменной ch присваивается символ s);
• обращаться к подстрокам, заключенным между двумя маркерами, используя метод Substring класса string.wordBegin указывает на начало подстроки, а wordEnd, очевидно, — на ее конец.
Например, фрагмент кода
int wordLength;
wordBegin = 5;
wordEnd = 7;
wordLength = wordEnd - wordBegin;
Console.WriteLine(myText.SubString(wordBegin, wordLength);
выводит на консоль текст "is".
Если wordBegin всегда указывает на начало слова, переменную wordEnd можно перемещать посимвольно в поиске конца слова. Это иллюстрируется. В соответствии с предыдущими определениями слова wordEnd находит конец слова, если:|
· wordEnd указывает на символ пробела
· wordEnd достигает конца текста
Найденное слово можно извлечь с помощью метода Substring, так как на этот момент четко известно, что wordBegin и wordEnd обозначают границы слова.
Последний шаг этого цикла алгоритма — переместить маркер wordBegin на первый символ следующего слова. Для этого ему присваивается значение wordEnd плюс один. Смысл очевиден: когда wordEnd определяет конец слова, эта переменная указывает на пробел перед следующим словом. Последнее справедливо до тех пор, пока не достигнут конец текста. В этом случае алгоритм прекращает работу; не пытаясь переместить маркер wordBegin.