Регулярные выражения (Регулярное выражение) предоставляют эффективный и удобный метод сопоставления строковых шаблонов. Практически все языки высокого уровня обеспечивают поддержку регулярных выражений или предоставляют готовые библиотеки кода для вызова. В этой статье в качестве примера рассматриваются общие задачи обработки в среде ASP, чтобы познакомить вас с навыками применения регулярных выражений.
1. Проверьте формат паролей и адресов электронной почты.
Наш первый пример демонстрирует базовую функцию регулярных выражений: абстрактное описание произвольно сложных строк. Это означает, что регулярные выражения дают программистам формальный метод описания строк, который может описать любой строковый шаблон, встречающийся в приложении, с помощью лишь небольшого объема кода. Например, для людей, не занимающихся технической работой, требования к формату пароля можно описать следующим образом: первый символ пароля должен быть буквой, длина пароля должна быть не менее 4 символов и не более 15 символов. пароль не может содержать кроме букв, цифр и символов, кроме подчеркивания.
Как программисты, мы должны преобразовать приведенное выше описание формата пароля на естественном языке в другие формы, чтобы страница ASP могла понять и применить его для предотвращения незаконного ввода пароля. Регулярное выражение, описывающее этот формат пароля: ^[a-zA-Z]w{3,14}$.
В приложениях ASP мы можем записать процесс проверки пароля как функцию многократного использования, как показано ниже:
Функция TestPassword(strPassword)
Дим ре
Установить re = новое RegExp
re.IgnoreCase = false
re.global = ложь
re.Pattern = "^[a-zA-Z]w{3,14}$"
TestPassword = re.Test(strPassword)
Конечная функция
Ниже мы сравниваем регулярное выражение для проверки формата пароля с описанием на естественном языке:
первым символом пароля должна быть буква: описание регулярного выражения — «^[a-zA-Z]», где «^» указывает на начало строки, а дефис сообщает RegExp, что он должен соответствовать всем символам в указанном диапазоне.
Пароль должен содержать не менее 4 и не более 15 символов: описание регулярного выражения — «{3,14}».
Пароль не может содержать символы, кроме букв, цифр и подчеркиваний: описание регулярного выражения — «w».
Несколько примечаний: {3, 14} означает, что предыдущий шаблон соответствует как минимум 3, но не более 14 символам (плюс первый символ становится от 4 до 15 символов). Обратите внимание, что синтаксис фигурных скобок чрезвычайно строг и не допускает пробелов по обе стороны от запятой. Добавление пробелов повлияет на смысл регулярного выражения и приведет к ошибкам при проверке формата пароля. Кроме того, символ «$» не добавляется в конце приведенного выше регулярного выражения. Символ $ заставляет регулярное выражение соответствовать строке до конца, обеспечивая действительный пароль без каких-либо дополнительных символов после него.
Подобно проверке формата пароля, проверка легитимности адресов электронной почты также является очень распространенной проблемой. Использование регулярных выражений для простой проверки адреса электронной почты можно реализовать следующим образом:
<%.
Дим ре
Set re = new RegExp
re.pattern = "^w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$"
Ответ.Напишите re.Test(" [email protected] ")
%>
2. Извлечение определенных частей HTML-страницы
Основная проблема, с которой приходится сталкиваться при извлечении контента из HTML-страницы, заключается в том, что мы должны найти способ точно идентифицировать нужную нам часть контента. Например, ниже приведен фрагмент HTML-кода, отображающий заголовки новостей:
<table border="0" width="11%" class="Somestory">
<тр>
<td ширина="100%">
<p align="center">Другое содержимое...</td>
</тр>
</таблица>
<таблица border="0" width="11%" class="Headline">
<тр>
<td ширина="100%">
<p align="center">Война в Ираке! </тд>
</тр>
</таблица>
<таблица border="0" width="11%" class="Someotherstory">
<тр>
<td ширина="100%">
<p align="center">Другое содержимое...</td>
</тр>
</table>
Наблюдая за приведенным выше кодом, легко увидеть, что заголовок новости отображается в таблице посередине, а ее атрибут класса имеет значение Headline. Если HTML-страница очень сложная, вы можете использовать дополнительную функцию, предоставляемую Microsoft IE, начиная с версии 5.0, для просмотра только HTML-кода выбранной части страницы. Посетите http://www.microsoft.com/Windows/ie. /WebAccess/default.ASP Узнайте больше. В этом примере мы предполагаем, что это единственная таблица, атрибут класса которой имеет значение Заголовок. Теперь нам нужно создать регулярное выражение, найти эту таблицу заголовков с помощью регулярного выражения и включить эту таблицу на нашу собственную страницу. Первый — написать код, поддерживающий регулярные выражения:
<%
Тускло, strHTML
Set re = new RegExp 'Создание объекта регулярного выражения
re.IgnoreCase = true
re.Global = false 'Завершить поиск после первого совпадения
%>
Теперь рассмотрим область, которую мы хотим извлечь: здесь мы хотим извлечь всю структуру <table>, включая закрывающий тег и текст заголовка новости. Поэтому начальным символом поиска должен быть открывающий тег <table>: re.Pattern = "<table.*(?=Headline)". Это регулярное выражение соответствует начальному тегу таблицы и может возвращать все, что находится между начальным тегом и «Заголовком» (кроме новой строки). Вот как вернуть совпадающий HTML-код:
'Поместите все совпадающие HTML-коды в коллекцию Matches.
Set Matches = re.Execute(strHTML)
'Показать все соответствующие HTML-коды
Для каждого предмета в матчах
Ответ.Записать элемент.Значение
Далее
'Показать один из
Response.write Matches.Item(0).Value
запускает этот код для обработки показанного ранее фрагмента HTML. Регулярное выражение возвращает содержимое совпадения следующим образом: <table border="0" width="11%" class=". Регулярное выражение "(?=Headline)" в выражении не получает символы, поэтому значение атрибута класса таблицы невозможно увидеть. Код для получения остальной части таблицы также довольно прост: re.Pattern =. «<table.*(?=Headline) (.|n)*?</table>». Среди них: «*» после «(.|n)» соответствует 0 и более любым символам и «? ” минимизирует диапазон совпадений «*», то есть соответствует как можно меньшему количеству символов перед поиском следующей части выражения. </table> — это конечный тег таблицы.
Ограничитель «?» очень важен, он предотвращает. выражение из возврата кода для других таблиц. Например, для приведенного выше фрагмента кода HTML, если вы удалите этот знак «?», возвращаемое содержимое будет:
<table border="0" width="11%" class=" Заголовок">
<тр>
<td ширина="100%">
<p align="center">Война в Ираке! </тд>
</тр>
</таблица>
<таблица border="0" width="11%" class="Someotherstory">
<тр>
<td ширина="100%">
<p align="center">Другое содержимое...</td>
</тр>
</таблица>
Возвращенное содержимое содержит не только тег <table> таблицы Headline, но и таблицу Someotherstory. Видно, что знак «?» здесь важен.
Этот пример предполагает некоторые довольно идеалистические предпосылки. В реальных приложениях ситуация часто намного сложнее, особенно когда вы не имеете никакого влияния на написание используемого исходного HTML-кода, написание ASP-кода особенно затруднено. Самый эффективный метод — уделять больше времени анализу HTML рядом с извлекаемым контентом и часто проверять, чтобы убедиться, что извлеченный контент — это именно то, что вам нужно. Кроме того, вам следует обратить внимание и обработать ситуацию, когда регулярное выражение не может соответствовать какому-либо содержимому исходной HTML-страницы. Контент может меняться очень быстро, поэтому не допускайте нелепых ошибок на вашей странице только потому, что кто-то другой изменил формат контента.
3. Анализ текстовых файлов данных
. Существует множество форматов и типов файлов данных XML. Структурированный текст и даже неструктурированный текст часто становятся источниками данных для приложений ASP. Ниже мы рассмотрим пример структурированного текстового файла с использованием квалификаторов. Квалификаторы (например, кавычки) указывают, что части строки неразделимы, даже если строка содержит разделители, разделяющие запись на поля.
Ниже представлен простой структурированный текстовый файл:
фамилия, имя, номер телефона, описание Сунь, Укун, 312 555 5656, ASP очень хороший, Свинья, Бацзе, 847 555 5656, Я кинопродюсер.
Этот файл очень хороший
.simple Первая строка — это заголовок, а следующие две строки — это записи, разделенные запятыми. Разобрать этот файл тоже очень просто: достаточно разбить файл на строки (в соответствии с символами новой строки), а затем разбить каждую запись по полям. Однако, если мы добавим запятые к определенному содержимому поля:
фамилия, имя, номер телефона, описание Sun, Wukong, 312 555 5656, мне нравятся ASP, VB и SQL.
Свинья, Баджи, 847 555 5656, я кинопродюсер.
При разборе первой записи возникнет проблема, поскольку с точки зрения парсера, распознающего только запятые-разделители, ее последнее поле содержит содержимое двух полей. Чтобы избежать проблем такого типа, поля, содержащие разделители, должны быть окружены квалификаторами. Одинарные кавычки — часто используемый квалификатор. После добавления квалификатора одинарной кавычки в приведенный выше текстовый файл его содержимое будет следующим:
фамилия, имя, номер телефона, описание Сунь, Укун, 312 555 5656, «Мне нравится ASP, VB и SQL».
Чжу, Бацзе, 847 555 5656, «Я кинопродюсер».
Теперь мы можем определить, какая запятая является разделителем, а какая запятая является содержимым поля, то есть нам нужно рассматривать только запятые, появляющиеся внутри кавычек, как содержимое. поля. Следующее, что нам нужно сделать, — это реализовать анализатор регулярных выражений, который определяет, когда разбивать поля на основе запятых, а когда рассматривать запятые как содержимое поля.
Проблема здесь немного отличается от той, с которой сталкивается большинство регулярных выражений. Обычно мы просматриваем небольшую часть текста, чтобы увидеть, соответствует ли он регулярному выражению. Но здесь достоверно сказать, что находится внутри кавычек, мы можем только после рассмотрения всей строки текста.
Вот пример, иллюстрирующий проблему. Случайным образом извлеките половину строки содержимого из текстового файла и получите: 1, пляж, черный, 21, ', собака, кошка, утка, ', . В этом примере, поскольку слева от «1» есть другие данные, проанализировать их содержимое чрезвычайно сложно. Мы не знаем, сколько одинарных кавычек предшествует этому фрагменту данных, поэтому не можем определить, какие символы находятся внутри кавычек (текст внутри кавычек не может быть разделен во время синтаксического анализа). Если фрагменту данных предшествует четное число (или отсутствие) одинарных кавычек, то «', собака, кошка, утка, '» является строкой в кавычках и является неделимой. Если количество предыдущих кавычек нечетное, то «1, пляж, черный, 21, '» является концом строки и является неделимым.
Поэтому регулярное выражение должно анализировать всю строку текста с учетом количества кавычек, чтобы определить, находится ли символ внутри или вне пары кавычек, то есть:,(?=([^']*'[ ^']*') *(?![^']*')). Это регулярное выражение сначала находит кавычку, затем продолжает поиск и гарантирует, что количество одинарных кавычек после запятой будет четным или нулевым. Это регулярное выражение основано на следующем суждении: если количество одинарных кавычек после запятой четное, то запятая находится вне строки. В следующей таблице приведены более подробные инструкции:
, ищем запятую
(?= продолжает поиск в соответствии с этим шаблоном:
(Начать новый узор
[^']*' [символы без кавычек] 0 или более, за которыми следует кавычка
[^']*'[^']*) [символы без кавычек] 0 или более, за которыми следует кавычка. В сочетании с предыдущим содержимым он соответствует парам цитат.
)* завершает шаблон и соответствует всему шаблону (парам кавычек) 0 или более раз
(?! Поиск вперед, исключить этот шаблон
[^']*' [символы без кавычек] 0 или более, за которыми следует кавычка
) Ниже конечного режима
находится функция VBScript, которая принимает строковый параметр, разбивает строку в соответствии с разделителем-запятой и квалификатором одинарной кавычки в строке и возвращает массив результатов:
Function SplitAdv(strInput)
Тусклый объект
Set objRE = new RegExp
'Установить объект RegExp
objRE.IgnoreCase = правда
objRE.Global = правда
objRE.Pattern = ",(?=([^']*'[^']*')*(?![^']*'))"
' Метод replace использует chr(8) для замены того, что мы хотим чтобы использовать запятую, chr(8) равенb
' символ b может появляться в строке крайне редко.
' Затем мы разделяем строку по b и сохраняем ее в массив
SplitAdv = Split(objRE.Replace(strInput, "b"), "b")
Конечная функция
Короче говоря, использование регулярных выражений для анализа файлов текстовых данных имеет преимущества, заключающиеся в высокой эффективности и сокращении времени разработки. Это может сэкономить много времени при анализе файлов и извлечении полезных данных на основе сложных условий. В быстро развивающейся среде, где по-прежнему будет доступно много традиционных данных, знание того, как создавать эффективные процедуры анализа данных, будет ценным навыком.
4. Замена строк.
В последнем примере мы рассмотрим функцию замены регулярных выражений VBScript. ASP часто используется для динамического форматирования текста, полученного из различных источников данных. Используя возможности регулярных выражений VBScript, ASP может динамически изменять соответствующий сложный текст. Выделение некоторых слов путем добавления HTML-тегов является распространенным применением, например, для выделения ключевых слов в результатах поиска.
Чтобы проиллюстрировать, как это делается, давайте рассмотрим пример, в котором в строке выделяются все «.NET». Эту строку можно получить откуда угодно, например из базы данных или другого веб-сайта.
<%
Установить регулярное выражение = Новое регулярное выражение
regEx.Global = правда
regEx.IgnoreCase = True
'шаблон регулярного выражения,
«Ищите любое слово или URL-адрес, заканчивающийся на «.NET».
regEx.Pattern = "(b[a-zA-Z._]+?.NETb)"
' Строка, используемая для проверки функции замены
strText = «Microsoft создала новый веб-сайт www.ASP.NET ».
Вызовите метод replace регулярного выражения.
'$1 означает вставку совпавшего текста в текущую позицию
Response.Write regEx.Replace(strText, _
"<b style='color: #000099; размер шрифта: 18pt'>$1</b>")
%>
В этом примере необходимо отметить несколько важных моментов. Все регулярное выражение помещается в пару круглых скобок, и его функция состоит в том, чтобы перехватить все соответствующее содержимое для дальнейшего использования, на которое ссылается $1 в тексте замены. На одну замену можно использовать до 9 подобных перехватов, обозначенных от 1 до 9 долларов соответственно. Метод replace регулярных выражений отличается от функции replace самого VBScript. Ему требуются только два параметра: текст для поиска и текст для замены.
В этом примере, чтобы выделить искомые строки «.NET», мы окружаем их жирными тегами и другими атрибутами стиля. Используя эту технологию поиска и замены, мы можем легко добавить функцию выделения поисковых ключевых слов в программу поиска веб-сайта или автоматически добавлять ссылки на другие страницы по ключевым словам, которые появляются на странице.
Заключение
Я надеюсь, что несколько методов использования регулярных выражений, представленные в этой статье, вдохновили вас, когда и как применять регулярные выражения. Хотя примеры в этой статье написаны на VBScript, регулярные выражения также полезны в ASP.NET. Это один из основных механизмов проверки формы управления на стороне сервера, который экспортируется во все пространство имен .Text.RegularExpressions через систему. Пространство имен .Text.RegularExpressions.