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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
73
регулярного выражения должен встретиться во входной строке для того чтобы
соответствие можно было бы считать истинным.
Следующая таблица иллюстрирует различные квантификаторы и их
значение:
Символ
Описание
*
Соответствует повторению предшествующего
подвыражения ноль или более раз. Например, 'zo*'
соответствует 'z' и 'zoo'. * является эквивалентом {0,}.
+
Соответствует повторению предшествующего
подвыражения один или более раз. Например, 'zo+'
соответствует 'zo' и 'zoo', но не 'z'. + является эквивалентом {1,}.
?
Соответствует повторению предшествующего
подвыражения ноль или один раз. Например, "do(es)?"
соответствует "do" в "do" или в "does". ? является эквивалентом
{0,1}.
{n}
n является положительным целым числом. Соответствует
точно n-ному количеству повторений. Например, 'o{2}' не
соответствует 'o' в "Bob", но соответствует 2-м символам 'o' в
"food".
{n,}
n является положительным целым числом. Соответствует
хотя бы n-ному количеству повторений. Например, 'o{2,}' не
соответствует "o" в "Bob", но соответствует всем 'o' в "foooood".
'o{1,}' является эквивалентом 'o+'. 'o{0,}' является эквивалентом
'o*'.
{n,m}
m и n это положительные целые числа, причем n <= m.
Соответствует хотя бы n-ому и не более чем m-ому числу
повторений. Например, "o{1,3}" соответствует первым трем 'o' в
"fooooood". 'o{0,1}' является эквивалентом 'o?'. Обратите
внимание, что Вы не можете поместить пробел между запятой и
цифрами.
74
В большом входном документе (речь идет о нашем примере с
заголовками глав), число глав может легко превысить девять, так что Вам
понадобится способ обработки двух или даже трех цифр в номере главы.
Квантификаторы дают Вам эту возможность. Следующее регулярное
выражение соответствует заголовкам глав с любым количеством цифр: "Chapter
[1-9][0-9]*"
Квантификатор располагается после выражения-диапазона. Поэтому он
применяется ко всему выражению диапазона, который, в данном случае,
определяет только цифры от 0 до 9, включительно.
Квантификатор '+' здесь не используется, потому что цифра не
обязательно должна иметься во второй или в последующих позициях. Символ
'?' также не используется, потому что он номера глав только до двух цифр. Вы
же хотите задать соответствие по крайней мере одной цифре после пробела,
следующего сразу за 'Chapter'.
Если Вы точно знаете, что максимальное количество глав ограничено
числом 99, Вы можете использовать следующее выражение , чтобы определить
по крайней мере одну, но не больше чем 2 цифры. "Chapter [0-9]{1,2}"
Недостаток выражения, показанного выше - то, что, если имеется номер
главы большее чем 99, оно все равно будет соответствовать только первым
двум цифрам. Другой недостаток - то, что кто-то мог создать и главу с номером
0 и это тоже будет соответствовать. Следующие выражения лучше для
соответствия только двум цифрам: "Chapter [1-9][0-9]?" или "Chapter [1-9][0-
9]{0,1}"
Квантификаторы '*', '+' и '?' - все являются, что называется жадными, то
есть они соответствуют максимально возможному объему текста. Иногда это
совсем не то, что Вы хотите получить. Иногда, Вы хотите только минимального
соответствия.
Скажем, Вы ищете в документе HTML вхождения заголовков,
помещенных в тэги H1. Этот текст выглядит в Вашем документе как:
75
<H1>Chapter 1 – Introduction to Regular Expressions</H1>
Следующее выражение соответствует всему, что расположено от
открывающего знака "меньше чем" (<) до того что размещено за символом
"больше чем" (>) в конце закрытого тэга H1.: "<.*>"
Если все, чему мы действительно хотели задать соответствие, был
открытый H1 тэг, следующее "нежадное" выражение соответствует только
<H1> "<.*?>"
Помещая '?' после квантификатора '*', '+' или '?', Вы преобразуете
выражение из "жадного" в "нежадное" (или соответствующее минимуму).
До сих пор примеры, которые мы рассматривали, касались только
обнаружения заголовков глав, где бы они не встречались. Любое вхождение
строки 'Chapter', за которой размещены сначала пробел, а затем цифра, могло
быть действительно заголовком этой главы или оно также могло оказаться
перекрестной ссылкой на другую главу. Так как истинные заголовки глав
всегда расположены в начале строки, Вам нужно будет придумать способ
чтобы находить только заголовки и не находить перекрестные ссылки.
Так называемые "якоря" обеспечивают эту возможность. Якоря
позволяют Вам прикрепить регулярное выражение к началу или к концу
строки. Они также позволяют Вам создавать регулярные выражения, которые
работают в пределах одного слова, а также в начале или в конце слова.
Следующая таблица содержит список якорей в регулярных выражениях и их
значения:
Символ
Описание
^
Соответствует позиции в начале входной строки. Если
свойство Multiline объекта RegExp установлено в значение True,
тогда символ ^ также соответствует и позиции, следующей за
'\n' или '\r'.
$
Соответствует позиции в конце входной строки. Если
свойство Multiline объекта RegExp установлено в значение True,
тогда символ $ также соответствует и позиции,
76
предшествующей '\n' или '\r'.
\b
Соответствует границе слова, то есть позиции между
словом и пробелом.
\B
Имеет значение, обратное соответствию границе слова
(не-граница слова).
Вы не можете использовать квантификатор для якоря. Так как Вы не
можете иметь больше одной позиции до или после символа новой строки или
границы слова, выражения подобные '^*' не допускаются.
Чтобы соответствовать тексту в начале текстовой строки, используйте в
начале регулярного выражения символ '^'. Не путайте данное применение '^' с
применением его в выражениях в квадратных скобках. Это абсолютно разные
вещи.
Чтобы соответствовать тексту в конце текстовой строки, используйте в
конце регулярного выражения символ '$'.
Для поиска заголовков глав, расположенных в начале строк и имеющих
номера из одной или двух цифр, применимо следующее регулярное выражение:
"^Chapter [1-9][0-9]{0,1}"
Мало того, что настоящий заголовок главы находится в начале строки,
он также является единственным объектом в строке, так что он должен быть
расположен также и в конце строки. Следующее выражение гарантирует, что
указанное Вами соответствие подойдет только к заголовкам, а не к
перекрестным ссылкам. Это реализовано созданием регулярного выражения,
которое жестко привязано и к начало и к концу строки текста. "^Chapter [1-9][0-
9]{0,1}$"
Соответствие границам слова работает несколько иначе, но оно
добавляет очень важную возможность к регулярным выражениям. Граница
слова - это позиция между словом и пробелом. Не-граница слова - любая другая
позиция. Следующее выражение для JScript соответствует первым трем
77
символам слова 'Chapter', потому что они следуют непосредственно за границей
слова: "\bCha"
Позиция оператора '\b' здесь очень критична. Если он расположен в
начале строки, которая будет соответствовать, соответствие будет отыскиваться
в начале слова; если он расположен в конце строки, соответствие будет
отыскиваться в конце слова. Например, следующие выражения соответствуют
'ter' в слове 'Chapter', потому что оператор введен перед границей слова: /ter\b/ и
"ter\b"
Следующее выражение соответствует фрагменту 'apt', если он находится
в 'Chapter', и не соответствует, если фрагмент находится в 'aptitude': "\Bapt"
Это происходит потому, что 'apt' встречается не на границе слова в слове
'Chapter', за то на границе слова в слове 'aptitude'. Для оператора не-границы
слова его позиция не играет важной роли, потому что соответствие не
привязано к началу или концу слова.
Символ вариации '|' используют для того чтобы допустить выбор между
двумя и более вариантами. Расширяя описанное ранее регулярное выражение
для поиска текста заголовков глав, можно изменить его так, что оно станет
соответствовать не только заголовкам глав. Однако, все не так просто и
прямолинейно, как Вы могли бы подумать. При использовании вариации
соответствовать будет самое большое возможное выражение с обеих сторон
символа '|'. Вы могли бы подумать, что следующие выражения для JScript и
VBScript соответствуют или слову 'Chapter' или слову 'Section', за которыми
следует одна или две цифры, и которые встречаются в начале или конце строки:
"^Chapter|Section [1-9][0-9]{0,1}$"
К сожалению, на самом деле выходит, что регулярные выражения,
показанные выше, соответствуют или слову 'Chapter' в начале строки, или слову
'Section' в конце строки, независимо от того, следуют ли за этим словом цифры.
Если входная строка - 'Chapter 22' тогда выражение, показанное выше,
соответствует только слову 'Chapter'. Если входная строка - 'Section 22', тогда
выражение соответствует 'Section 22'. Но это не совсем то, что мы хотели
Источник: https://baza.diplomsite.ru/previewfile/2504