русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Шановні українці! Матеріал був перекладений з російської мови. Тому можуть бути незначні помикли...

Обробка форм JavaScript | Обробка даних форми

ЗАГОЛОВОК

1 Регулярні вирази
1.1 Синтаксис регулярних виразів
1.1.1 Представлення символів
1.1.2 Позиція всередині рядка
1.1.3 Квантифікація (пошук послідовності)
1.1.4 Угрупування
1.1.5 Перерахування
1.2 Використання регулярних виразів

 

1 Регулярні вирази

Регулярні вирази (англ. regular expressions, сокр. RegExp) - це формальний пязык пошуку підрядків в тексті і здійснення маніпуляцій з ними, заснований на писпользовании метасимволів (англ. wildcard characters). По суті це шаблон (англ. pattern), рядок-зразок, що складається з символів і метасимволів і пзадающая правило пошуку.
Регулярні виразу (РВ) винайшов американський пматематик, один із засновників напрями "комп'ютерні науки" Стефан Клінічну (Stephen Kleene), який описав поведінку моделі нейрона, запропонованої 1940-х років. Уорреном Маккалоком і Уолтером Питтсом, використовуючи свою систему пматематических позначень, названу їм "регулярні безлічі".
Регулярні вираження зробили прорив в електронній побработке текстів в кінці XX століття. Багато сучасні мови програмування пимеют вбудовану підтримку регулярних виразів. Серед них Perl, Java, PHP, JavaScript і багато ін.

 

1.1 Синтаксис регулярних виразів

1.1.1 Представлення символів

 

Регулярні вирази мають наступні можливості представлення символів:

  • Більшість символів в РВ є простими символами (литералами), тобто представляють самі себе, за винятком спеціальних псимволов [ ] \ ^ $ . | ? * + ( ) { } , які пявляются метасимволами і можуть бути екрановані (захищені) шляхом установки перед ними символу \ (зворотна коса риска) для ппредставления їх самих в якості символів. Можна екранувати пцелую послідовність символів, уклавши її між \Q \E.
  • Метасимвол . (точка) у регулярному виразі означає один будь-який символ (крім символу /n - новий рядок).
  • Набір символів у квадратних дужках [ ] іменується символьними класом і пробить можливим вказати інтерпретатору регулярних виразів, що на даному місці в пстроке може стоять один з перерахованих символів. Зокрема, [abc] задає пвозможность появи в тексті одного з трьох вказаних символів. Можна пуказать діапазон символів: наприклад, [А-Яа-я] відповідає всім букв російського палфавита, за винятком букв "Е" і "е". Якщо потрібно вказати символи, які пне входять в зазначений набір, то використовують символ ^ всередині квадратних дужках, пнапример [^0-9] означає будь-який символ, крім цифр;
  • /d - будь-яка цифра від 0 до 9 (еквівалентно [0-9]);
  • /D - будь-який нецифровой символ;
  • /f - символ перекладу сторінки;
  • /n - символ нового рядка;
  • /r - символ повернення каретки;
  • /s - символи пробілів, табуляції, перекладу сторінки, каретки і нового рядка;
  • /S - всі, за винятком перерахованого в /s;
  • /t - символ табуляції;
  • /v - символ вертикальної табуляції;
  • /w - буква, цифра або символ підкреслення;
  • /W - всі, за винятком перерахованого в /w;
  • /x{код} - символ з вказаними шестнадцатиричным кодом;
  • o{код} - символ з вказаними восьмиричным кодом;
  • /{номер групи} - витягує з пам'яті, збережену раніше групу символів пзаданным номером.
Заголовок

 

1.1.2 Позиція всередині рядка

Наступні символи дозволяють зосередити регулярний вираз потносительно елементів тексту початку і кінця рядка, меж слова:

  • ^ - початок рядка, тобто що перевіряється текст повинен обов'язково починатись з пначала рядка;
  • $ - кінець рядка, тобто що перевіряється текст повинен обов'язково закінчуватись на пконце рядка;
  • \b - межа слова;
  • \B - не межа слова.
Заголовок

 

1.1.3 Квантифікація (пошук послідовності)

Квантификатор після символу, символьного класу чи групи визначає, псколько раз попереднє вираз може зустрічатися (слід враховувати, що пквантификатор може ставитися більш ніж до одного символу у регулярному виразі, птолько якщо це клас символів або група):

  • {n} - рівно n;
  • {m,n} - від m до n включно;
  • {m,} - не менш m;
  • {,n} - не більше n;
  • * (зірка Клінічну) - нуль або більше;
  • + - один або більше;
  • ? - нуль або один.

Часто використовується послідовність *. побозначения будь-якої кількості будь-яких символів між двома частинами регулярного пвыражения.
Символьні класи в поєднанні з квантификаторами ппозволяют встановлювати відповідність з реальними текстами. Наприклад, стовпчиками пцифр, телефонами, поштовими адресами, елементами HTML-розмітки та ін.
символи { } не утворюють квантификатор, їх пспециальное значення ігнорується.

Заголовок

 

1.1.4 Угрупування

Для позначення групи використовуються круглі дужки, які визначають побласть дії і пріоритет операцій. Шаблон всередині групи обробляється як пединое ціле і може бути квантифицирован.

Одне з застосувань угрупування - повторне писпользование раніше знайдених груп символів (підрядків, блоків, зазначених пподвыражений). При обробці вираження підрядка, знайдені за шаблоном всередині пгруппы, зберігаються в окремій області пам'яті і отримують номер починаючи з одиниці. пКаждой підрядку відповідає пару дужок у регулярному виразі. Квантифікація пгруппы не впливає на збережений результат, тобто зберігається лише перше входження. пзазвичай підтримується до 9 нумерованих підрядків з номерами від 1 до 9, але пдеякі інтерпретатори дозволяють працювати з великою кількістю. Згодом пв межах даного регулярного виразу можна використовувати позначення від \1 \9 пдля перевірки на збіг з раніше знайденої підрядком.
Також раніше знайдені підрядка можна використовувати пякщо заміні за регулярним виразом. У такому разі в текст заміщення вставляються пте ж позначення, що і в межах самого вирази.
група використовується тільки для угруповання і бере участь результат надалі не буде потрібно, то можна використовувати угрупування пвида (?:шаблон). Під результат такого угруповання не виділяється окрема область ппамяти і, відповідно, їй не призначається номер. Це позитивно впливає на пскорость виконання вирази, але зменшує readability.

Заголовок

1.1.5 Перерахування

Вертикальна риска розділяє можливі варіанти. Наприклад, gray|grey псоответствует gray або grey. Слід пам'ятати, що перебір варіантів виконується пслева направо, як вони вказані.
потрібно вказати перелік варіантів всередині пболее складного регулярного виразу, то його потрібно укласти в групу. Наприклад, gray|grey або gr(a|e)y описують рядок gray або grey. У випадку з лише одну літеру пальтернативами кращий варіант gr[ae]y, так як порівняння з символьними пклассом виконується простіше, ніж обробка групи з перевіркою на всі її можливі пмодификаторы.

Заголовок

 

1.2 Використання регулярних виразів

У мові JavaScript за обробку регулярних виразів відповідає клас RegExp. Його конструктор (форма 1):

RegExp("Регулярний вираз" [, прапори])

має один обов ’ язковий параметр - регулярний вираз, пзаключенное в лапки, і один необов'язковий, який задає додаткові ппараметры пошуку і може включати в різних поєднаннях три символи.
Символ "g" задає пглобальный пошук, тобто пошук всіх записів регулярного виразу у рядку, псимвол "" - ігнорування регістр символів, па символ "svojn" - багаторядковий пошук.
Наприклад, для створення регулярного виразу, ппроверяющего правильність введення прізвища користувача латинськими символами, пкоторая повинна починатися з великої літери і мати всі наступні літери пстрочные, необхідно використовувати наступний конструктор

re=new RegExp("^[A-Z][a-z]+$");

Символи ^ $ означають, що ім'я користувача повинно пначинаться на початку рядка і закінчуватися в кінці рядки, тобто ні перед, пні після імені користувача не повинно бути ніяких зайвих символів.
Відсутність квантора повторення після [A-Z] еквівалентно використання квантора {1}, тобто в цьому випадку великі символи повинні пвстречаться у рядку тільки один раз. Клас символів [a-z] з квантором повторення + означає, що ппрописных латинських букв у рядку може бути одна і більше.
Доступний також такий варіант конструктора, пблизкий до PERL, PHP (форма 2):

/Регулярний вираз/[прапори]) .

Його застосування для того ж самого РВ дає такий вираз

re=/^[A-Z][a-z]+$/;

Щоб можна було застосувати регулярні вирази для вирішення завдань перевірки, пзамены і пошуку фрагментів тексту, необхідно скористатися наступними пметодами об'єкта String:

  • match(регулярний вираз) - виконує пошук у рядку, використовуючи прегулярное вираз, передане в якості параметра, і повертає масив з презультатами пошуку. Якщо нічого не знайдено, возвращает null;
  • replace(регулярний вираз, текст для заміни) - виконує пошук і заміну пв рядку, використовуючи регулярний вираз, передане в якості параметра, і пвозвращает рядок, отриману в результаті цих замін;
  • search(регулярний вираз) - виконує пошук у рядку, використовуючи прегулярное вираз, передане в якості параметра, і повертає позицію ппервой підрядка, збігається з регулярним виразом.

Клас RegExp також підтримує три методу:

  • compile("Регулярний вираз" [, прапори]) - компілює регулярне выражежние ппо внутрішній формат для прискорення роботи. Також може використовуватися для пзміни РВ;
  • exec(Рядок) - аналогічний методом match класу String за тим винятком, пщо належить до класу RegExp, а рядок, де потрібно зробити пошук, передається пяк параметр;
  • test(Рядок) - аналогічний методом search класу String за тим винятком, пщо належить до класу RegExp, а рядок, де потрібно зробити пошук, передається пяк параметр. Возвращает або залежно від того, чи був успішним пошук або ударить ногою.

У прикладі № 1 показано пприменение регулярних виразів для перевірки правильності введення імені ппользователя і адреси електронної пошти (E-MAIL).

Заголовок

Приклад 1

<HTML>
<HEAD>
<TITLE>Обробка форми за допомогою регулярних виразів JavaScript</TITLE>
<SCRIPT>
function reg()
{
if(!f.name.value)
{
alert("ВВЕДІТЬ ІМ'Я ТА НАТИСНІТЬ КНОПКУ"ПЕРЕДАТИ\"");
f.name.focus();
}
else
{
re=/^[A-Z][a-z]+\s[A-Z]\.$;
re.compile(re);
if(!f.name.value.match(re))
{
alert("ІМ'Я ВВЕДЕНО НЕПРАВИЛЬНО. ВИПРАВТЕ І НАТИСНІТЬ КНОПКУ \"ПЕРЕДАТИ\"");
f.name.focus();
}
else
{
if(!f.mail.value)
{
alert("УВЕДІТЬ E-MAIL І НАТИСНІТЬ КНОПКУ \"ПЕРЕДАТИ\"");
f.mail.focus();
}
else
{
re2=new RegExp("^(\\w+)@(\\w+(\\.\\w+)+)$");
if(!re2.exec(f.mail.value))
{
alert("E-MAIL ВВЕДЕНО НЕПРАВИЛЬНО. ВИПРАВТЕ І НАТИСНІТЬ КНОПКУ \"ПЕРЕДАТИ\"");
f.mail.focus();
}
else if(confirm("Дані введено вірно. Завантажити сторінку?")) f.submit();
}
}
}
}
</SCRIPT>
</HEAD>
<BODY onLoad="f.name.focus()">
<FORM NAME="f" ACTION="js_pr4-3.htm">
<P>ВВЕДІТЬ ІМ'Я:
<INPUT type=text NAME="name" value="Ivanova."><BR>;
<P>ВВЕДІТЬ E_MAIL:
<INPUT type=text NAME="mail" value="ivanov@KPI.Kharkov.ua"><BR>;
<INPUT type=reset value="СКИДАННЯ">
<INPUT type=button VALUE="ПЕРЕДАТИ" onClick="reg()">
</FORM>
</BODY>
</HTML>

Після натискання кнопки "НАДІСЛАТИ" для кожного виду даних спочатку перевіряється, пвведены чи ці дані користувачем. Якщо немає - виводиться на екран відповідне пповідомлення.

Далі за допомогою РВ перевіряється відповідність пвведенных даних встановленим шаблоном. Для імені використовується описаний вище пформат. Передбачається, що дані будуть вводиться латинськими літерами. пПричем для перевірки імені користувача використовується метод match() об'єкта String, а пдля перевірки адреси електронної пошти - еквівалентний за дії метод exec() об'єкта RegExp.
того, для першого регулярного виразу кокористаний метод compile() об'єкта RegExp для перетворення РВ у внутрішній формат, що пробить можливим прискорити роботу з ним.
Щоб показати, що регулярні вирази пдействительно перевірте введені дані, в імені користувача, заданого пумолчанию, були допущені неточності - замість завдання "Ivanov A." було задано "Ivanova.", тобто прізвище не відокремлена від імені пропуском і ім'я користувача пуказано з великої літери.
Метод match() виявляє ці помилки і на екран видається повідомлення: ІМ'Я ВВЕДЕНО пНЕВЕРНО. ВИПРАВТЕ І НАТИСНІТЬ КНОПКУ "НАДІСЛАТИ".
Після усунення обох помилок і натискання кнопки "ПЕРЕДАТИ" на екрані з'являється повідомлення і питання "Дані введено вірно. пЗагрузить сторінку?". При позитивному рішенні користувача завантажується пуказанная Web-сторінка ("js_pr4-3.htm").

Заголовок

Переглядів: 4535

Повернутися взміст


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн