Дипломная работа: Автоматизация "личного кабинета" консультанта по недвижимости (на примере организации Росинформ)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
78
реализовать, и здесь должен быть способ сделать так, чтобы регулярное
выражение стало более чувствительным к нашим запросам и такой способ
действительно существует.
Вы можете использовать круглые скобки для ограничения области
действия вариации, то есть для получения уверенности, что она применяется
только к этим двум словам, 'Chapter' и 'Section'. Однако, круглые скобки тоже не
так просты, потому что они кроме того используются и для создания
подвыражений (но это будет описано далее в соответствующем разделе
справки). Используя регулярные выражения, показанные выше и добавляя
круглые скобки в нужных местах, Вы сможете заставить регулярное выражение
соответствовать и 'Chapter 1' и 'Section 3'.
Следующие регулярные выражения используют круглые скобки для
группировки слов 'Chapter' и 'Section', поэтому выражение будет работать
должным образом.
"^(Chapter|Section) [1-9][0-9]{0,1}$"
Эти выражения работают нормально, но при этом обладают интересным
побочным эффектом. Когда мы помещаем 'Chapter|Section' внутрь круглых
скобок, мы организуем требуемую группировку, но кроме того это приводит к
тому, что одно из найденных соответствий будет сохранено (захвачено) для
будущего использования. Так как в выражениях, показанных выше,
присутствует только один набор с круглыми скобками, как следствие у нас
будет только одно найденное подсоответствие. Впоследствии можно будет
ссылаться на него, используя коллекцию в VBScript.
Иногда сохранение подсоответствия желательно, иногда - нет. В
примерах, показанных выше, все, что Вы действительно хотите сделать - это
использовать круглые скобки для создания альтернативного выбора между
словами 'Chapter' и 'Section'. Вы не обязательно хотите ссылаться позже на это
соответствие. Фактически, до того момента, когда вам действительно
понадобится сохранять подсоответствия, не пользуйтесь этой возможностью.
Ваши регулярные выражения будут более эффективны, так как они не будут
79
требовать дополнительного времени и памяти для обработки и сохранения этих
подсоответствий.
Вы можете использовать '?:' перед шаблоном регулярного выражения
внутри круглых скобок для предотвращения сохранения соответствия для
возможного будущего использования. Следующая далее модификация
регулярных выражений обеспечивает те же возможности без сохранения
подсоответстсвий.
"^(?:Chapter|Section) [1-9][0-9]{0,1}$"
В дополнение к метасимволам '?:', также существуют два других
"несохраняющих" метасимвола, которые используются для так называемого
"заглядывания вперед" (lookahead). Положительное соответствие с
заглядыванием вперед, задаваемое использованием метасимволов '?=',
соответствует разыскиваемой строке в любой точке где соответствующий
щаблон регулярного выражения в круглых скобках начинается search string at
any point where a matching regular expression pattern in parentheses begins.
Положительное соответствие с заглядыванием вперед, задаваемое
использованием метасимволов '?!', matches the search string at any point where a
string not matching the regular expression pattern begins.
Например, предположим, что у Вас есть документ, содержащий ссылки
на Windows 3.1, Windows 95, Windows 98 и Windows NT. Предположим далее,
что Вы должны модифицировать этот документ, находя все ссылки на Windows
95, Windows 98 и Windows NT и заменяя их ссылками на Windows 2000. Вы
можете использовать следующее регулярное выражение на JScript, которое
является примером положительного заглядыванием вперед, для задания
соответствия для Windows 95, Windows 98 и Windows NT:
/Windows(?=95 |98 |NT )/
Для того чтобы проделать тоже самое в VBScript, используйте
следующее:
"Windows(?=95 |98 |NT )"
80
Если соответствие найдено, поиск следующего соответствия начинается
непосредственно после найденного соответствия, без учета символов,
включенных в выражение с "заглядыванием вперед". Например, если
выражение, показанные выше соответствует 'Windows 98', поиск будет
продолжен после 'Windows', а не после '98'.
Одной из самых важных возможностей регулярных выражений является
возможность сохранения фрагмента, соответствующего шаблону, для
последующего его использования. Как вы помните, размещение круглых
скобок вокруг шаблона регулярного выражения, или части шаблона, приводит к
тому, что этот фрагмент выражения будет сохранен во временном буфере. Вы
можете предотвратить сохранение этого фрагмента регулярного выражения с
помощью использования нефиксирующих метасимволов '?:', '?=', или '?!'.
Все зафиксированные подсоответствия сохраняются в том порядке, как
они встретились в направлении слева направо в шаблоне регулярного
выражения. Номера буферов, хранящих найденные подсоответствия,
начинаются с 1 и продолжаются максимум до 99 подвыражений. К каждому
отдельному буферу можно обратиться, используя '\n', где n - одна или две
десятичных цифры, идентифицирующие определенный буфер.
Одно из самых простых и наиболее полезных применений обратных
ссылок позволяет обнаружить вхождение в тексте вместе двух идентичных
слов. Рассмотрим следующее предложение:
Is is the cost of of gasoline going up up?
Данное предложение явно имеет проблему с несколькими словами-
дубликатами. Было бы неплохо придумать способ определять это предложение
без необходимости производить поиск дубликатов каждого отдельного слова.
Следующее регулярное выражение на JScript использует единственное
подвыражение, чтобы реализовать это.
/\b([a-z]+) \1\b/gi
Эквивалентное выражение на VBScript:
"\b([a-z]+) \1\b"
81
Подвыражением в этом случае является все, что находится между
круглыми скобками. Это выражение состоит из одного или более алфавитного
символа, что определено с помощью '[a-z]+'. Вторая часть регулярного
выражения это ссылка на предыдущее зафиксированное подсоответствие, а
значит это - второе вхождение слова только что подошедшее под выражение в
скобках. '\1' используется для определения первого подсоответствия.
Метасимволы границ слова гарантируют, что будут обнаружены только
раздельные слова. Если же их не будет в выражении, тогда фраза типа "is
issued" или "this is" будет некорректно идентифицирована этим выражением.
В выражении JScript глобальный флаг ('g') после регулярного выражения
указывает на то, что выражение будет применяться к такому количеству
соответствий, сколько сможет найти во входной строке. Флаг
нечувствительности к регистру ('i') в конце выражения определяет
нечувствительность к регистра символов. Флаг мультистрочности определяет
то, что потенциальные соответствия могут происходить с обеих сторон символа
новой строки. Для VBScript многие флаги не могут быть установлены
непосредственно в выражении, а должны быть установлены явным образом в
свойствах объекта RegExp.
Используя регулярное выражение, показанное выше, следующий код
JScript может использовать информацию подсоответствия для замены вхождени
двух последовательных идентичных слов в строке текста на одиночное
вхождение того же самого слова:
var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim; //Создаем образец для регулярного
выражения.
var rv = ss.replace(re,"$1"); //Заменяем два вхождения на одно.
Наиболее близкий эквивалент этого кода на VBScript выглядит
следующим образом:
Dim ss, re, rv
ss = "Is is the cost of of gasoline going up up?." & vbNewLine
82
Set re = New RegExp
re.Pattern = "\b([a-z]+) \1\b"
re.Global = True
re.IgnoreCase = True
re.MultiLine = True
rv = re.Replace(ss,"$1")
Обратите внимание, что в коде VBScript глобальный флаг,
мультистроковый флаг и флаг нечувствительности к регистру устанавливают,
используя соответственно названные свойства объекта RegExp.
Использование $1 внутри метода Replace создает ссылку на первое
сохраненное подсоответствие. Если Вы имеете более одного подсоответствия,
Вы доkжны ссылаться на них последовательно через $2, $3, и так далее.
Другое применение обратных ссылок состоит в возможности разобрать
Универсальный Индикатор Ресурса (URI) на составляющие его части.
Предположим, что Вы хотите разобрать следующий URI до следующих частей:
протокола (ftp, http, и т.д), доменного адреса и страницы/пути:
http://msdn.microsoft.com:80/scripting/default.htm
Следующие далее регулярные выражения обеспечивают эту
функциональность. Для JScript:
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
Для VBScript:
"(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"
Первое заключенное в скобки подвыражение предназначено для
выделении протокола сети из сетевого адреса. Это подвыражение соответствует
любому слову, которое предшествует двоеточию и двум косым чертам. Второе
заключенное в скобки подвыражение предназначено для выделения доменной
части из сетевого адреса. Это подвыражение соответствует любой
последовательности символов, которая не включает символы '^', '/', или ':'.
Третье заключенное в скобки подвыражение отделяет номер порта, если он
определен. Подвыражение соответствует нулю или большему количеству цифр
Источник: https://baza.diplomsite.ru/previewfile/2504