Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базовые технологии платформы .NET.pdf
Скачиваний:
66
Добавлен:
11.05.2015
Размер:
1.73 Mб
Скачать

\btext\b отдельное слово text

\b[bcf]at\b слова bat, cat, fat

В .NET имеется пространство имён System.Text.RegularExpressions, со-

держащее набор типов для работы с регулярными выражениями. Основной тип для работы с регулярными выражениями – это класс Regex. Объект класса представляет одно регулярное выражение, которое указывается при вызове конструктора. Существует перегруженная версия конструктора, позволяющая указать различные опции для создаваемого регулярного выражения.

Regex re1 = new Regex(@"\b[bcf]at\b");

Regex re2 = new Regex(@"\b[bcf]at\b", RegexOptions.IgnoreCase);

Для поиска информации согласно текущему регулярному выражению можно использовать метод Regex.IsMatch(). Более продуктивным является применение функции Match(), которая возвращает объект класса Match.

Regex re = new Regex(@"\b[bcf]at\b", RegexOptions.Compiled); Match match = re.Match("bad fat cat");

while (match.Success)

{

Console.WriteLine(match.Index);

Console.WriteLine(match.Value); match = match.NextMatch();

}

Для замены на основе регулярных выражений используется метод Regex.Replace(). Его аргументы – обрабатываемая строка и строка на замену.

4. Преобразование информации

Платформа .NET и языки программирования, построенные на её основе, предлагают богатый набор средств для решения задачи преобразования информации в данные различных типов.

Язык C# поддерживает операции явного и неявного преобразования типов, причём эти операции могут быть перегружены в пользовательских типах. При этом желательно, чтобы перегружаемые операции преобразования имели простую семантику и работали на сходных множествах значений.

Для выполнения взаимных преобразований данных базовых типов (числовые типы, bool, string и DateTime) предназначен статический класс System.Convert. Этот класс содержит набор методов вида ToИмяТипа(), где ИмяТипа является именем CLR для базовых типов. Каждый такой метод перегружен и принимает аргумент любого базового типа. Выполнение метода может быть успешным или генерировать исключения InvalidCastException,

FormatException, OverflowException.

byte

x

=

Convert.ToByte("123");

//

x

=

123

bool

y

=

Convert.ToBoolean(10.5);

//

y

=

true

12

int z = Convert.ToInt32(DateTime.Now);

// InvalidCastException

Класс Convert также содержит методы для взаимных преобразований массива байтов в строку (или массив символов) в формате Base-64:

// конвертируем массив в Base64 и выполним обратное преобразование byte[] data = {10, 20, 30, 40, 50}; Console.WriteLine(Convert.ToBase64String(data));

data = Convert.FromBase64String("ChQeKDI=");

Отметим, что для унификации операций преобразования все базовые типы явным образом реализуют интерфейс System.IConvertible. Это интерфейс содержит набор методов вида ToИмяТипа(), где ИмяТипа – имя CLR для базовых типов. Каждый такой метод принимает аргумент типа IFormatProvider. Базовые типы при реализации IConvertible просто вызывают соответствующие методы класса Convert.

Статический класс System.BitConverter содержит набор методов для преобразования переменной числового или булевого типа в массив байтов, а также методы обратного преобразования. Подобные преобразования полезны при низкоуровневой работе с потоками данных.

byte[] data = BitConverter.GetBytes(10567); int x = BitConverter.ToInt32(data, 0);

Важными видами преобразований являются получение строкового представления объекта и получение объекта из строки. Для получения строкового представления объекта можно использовать виртуальный метод ToString(), определённый в классе System.Object. Однако часто требуется дать возможность выбора формата представления и учесть региональные стандарты. Для этой цели предназначен интерфейс System.IFormattable, который реализуют числовые типы, структура DateTime, класс Enum и некоторые другие типы.

public interface IFormattable

{

string ToString(string format, IFormatProvider formatProvider);

}

Первый параметр метода IFormattable.ToString() – это строка, сообщающая способ форматирования объекта. Многие типы различают несколько строк форматирования. Например, структура DateTime поддерживает строку "d" для дат в кратком формате, "D" для дат в полном формате, "T" – для времени и т. д. Числа поддерживают строку "X" для шестнадцатеричного вывода, "C" – для валют, "E" – для научного формата. Числовые типы также различают шаблоны форматирования, чтобы отобразить нужное количество цифр и знаков в дробной части (полную информацию о строках форматирования смотрите в справке MSDN).

13

Второй параметр метода IFormattable.ToString() – это поставщик формата. Это объект, реализующий интерфейс IFormatProvider.

public interface IFormatProvider

{

object GetFormat(Type formatType);

}

Поставщик формата знает, как обеспечить учёт региональных стандартов, влияющих на форматирование чисел, дат и времени. Метод GetFormat() возвращает нужный объект для форматирования по его типу. Например, объект класса NumberFormatInfo описывает группу свойств NegativeSign,

CurrencyDecimalSeparator, CurrencySymbol, NumberGroupSeporator и т. п. У объекта класса DateTimeFormatInfo имеются свойства Calendar, DayNames,

DateSeparator, LongDatePattern, ShortTimePattern, TimeSeparator и т. п.

Платформа .NET содержит несколько поставщиков формата, в частности, класс CultureInfo1 . Конструктор этого класса принимает числовой или строковый идентификатор культуры. Свойство CultureInfo.InvariantCulture описывает инвариантную культуру, не связанную с региональными стандартами.

//дата, которую будем форматировать var dt = new DateTime(2012, 12, 21);

//создаём поставщик формата для русской культуры

//список кодов: http://msdn.microsoft.com/en-us/goglobal/bb896001 var culture = new CultureInfo("ru-Ru");

//s1 = "21 декабря 2012 г."

var s1 = dt.ToString("D", culture);

// используем инвариантную культуру

var s2 = dt.ToString("D", CultureInfo.InvariantCulture);

// используем культуру текущего потока выполнения var s3 = dt.ToString("D", null);

Чаще всего при получении строкового представления объекта нужно указать только формат, довольствуясь региональными стандартами, связанными с вызывающим потоком. Для упрощения работы во многие типы добавлены перегруженные версии метода ToString(), вызывающие IFormattable.ToString() с аргументами по умолчанию:

int x = 1024;

var s1 = x.ToString(); var s2 = x.ToString("X");

1 Классы CultureInfo, NumberFormatInfo, DateTimeFormatInfo определены в пространстве имён System.Globalization.

14

var s3 = x.ToString(CultureInfo.InvariantCulture);

Любой тип может определять дополнительные методы для получения строкового представления данных. Например, в DateTime определены методы

ToLongDateString(), ToShortDateString(), ToLongTimeString(),

ToShortDateString().

Для получения данных типа по строке обычно используются статические методы, которые по соглашению об именовании называются Parse() и TryParse(). Если преобразование из строки невозможно, метод Parse() генерирует исключение, а TryParse() возвращает значение false. Методы Parse() и TryParse() есть во всех примитивных типах, классе Enum, в типах для работы со временем и во многих других типах. Обычно данные методы имеют перегруженные версии, принимающие в качестве аргумента поставщик формата. Некоторые типы дополнительно перегружают Parse() и TryParse() для более тонкой настройки преобразования:

int x = Int32.Parse("1024");

int z = Int32.Parse("A03", NumberStyles.HexNumber); int y;

if (Int32.TryParse("4201", out y))

{

Console.WriteLine("Success");

}

DateTime dt = DateTime.Parse("13/01/2000 16:45:06");

Платформа .NET способна поддерживать различные текстовые кодировки и наборы символов. Для этого используется базовый класс System.Text.Encoding и наследники этого класса – конкретные кодировки. Чтобы получить объект-кодировку можно использовать статический метод Encoding.GetEncoding() или статические свойства для популярных кодировок:

//используется имя кодировки по стандарту IANA (www.iana.org)

Encoding utf8 = Encoding.GetEncoding("utf-8");

//распространённую кодировку можно получить через свойство

Encoding ascii = Encoding.ASCII;

Основными методами каждого объекта-кодировки являются GetBytes() и GetString(). Первый метод нужен для перевода строки или массива символов в массив байтов (коды символов), второй метод делает обратное преобразование:

Encoding ascii = Encoding.ASCII;

byte[] asciiBytes = ascii.GetBytes("Sample text"); string s = ascii.GetString(asciiBytes);

15