Регулярные выражения. Объект RegExp Объект типа RegExp, или, короче, регулярное выражение, можно создать двумя путями
Скачать 31.42 Kb.
|
Регулярные выражения в javascript имеют особую краткую форму и стандартный PCRE-синтаксис. Работают они через специальный объект RegExp. Кроме того, у строк есть свои методы search,match,replace, но чтобы их понять - разберем сначала RegExp. Объект RegExp Объект типа RegExp, или, короче, регулярное выражение, можно создать двумя путями /pattern/флаги new RegExp("pattern"[, флаги]) pattern - регулярное выражение для поиска (о замене - позже), а флаги - строка из любой комбинации символов g(глобальный поиск), i(регистр неважен) и Ш(многострочный поиск). Первый способ используется часто, второй - иногда. Например, два таких вызова эквивалентны: var reg = /ab+c/i var reg = new RegExp("ab+c", "i") При втором вызове - т.к регулярное выражение в кавычках, то нужно дублировать \// эквивалентны re = new RegExp("\\w+") re = /\w+/ При поиске можно использовать большинство возможностей современного PCRE-синтаксиса. Спецсимволы в регулярном выражении
Пример 1: Задача: разбить строку, содержащую IP адрес ipv4 на компоненты Вход: текстовая строка четыре числа разделённые точкой Выход: четыре числа компоненты адреса var myRe = /(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)/; if (myRe.test('192.168.25.40')) { var ar = myRe.exec('192.168.25.40'); alert(ar[1] + '.' + ar[2] + '.' + ar[3] + '.' + ar[4]); } Пример 2 Выделение IP-адресов в тексте (IPv4) /* Ниже приведен пример регулярного выражения с пояснениями ( # начало группы (?=\d+\.\d+\.\d+\.\d+) # основная часть выражения, требующая формата: число.число.число.число (?: # начало незахватывающей группы (число 0-255 + опциональная точка) (?: # начало незахватывающей группы (число 0-255) 25[0-5] # 250-255 | # или 2[0-4][0-9] # 200-249 | # или 1[0-9]{2} # 100-199 | # или [1-9][0-9] # 10-99 | # или [0-9] # 0-9 ) # конец незахватывающей группы \.? # опциональная точка ){4} # конец незахватывающей группы (число + опциональная точка), повторяется четыре раза ) # конец группы */ var reg = /((?=\d+\.\d+\.\d+\.\d+)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.?){4})/g; var sourceStr = "Это строка, которая содержит IP-адрес: '192.68.35.35'," + "'0.0.0.0','255.0.0.0','192.168.1.0','192.168.0.1'," + "'255.255.255.0','1.1.1.1','255.255.255.255','249.249.249.249'," + "'200.200.200.200','199.199.199.199'"; var ips = null; while ((ips = reg.exec(sourceStr)) != null) Log.writeLine(ips[0]); Пример 3 Выделение IP-адресов в тексте (IPv6) /* Распознавание IP-адреса в формате IPv6: 2a03:1800:1:4:217:31ff:feb4:8d55 */ var reg = /([0-9a-f]|:){1,4}(:([0-9a-f]{0,4})*){1,7}$/ig; var sourceStr = "Эта строка содержит адрес в формате IPv6: 2a03:1800:1:4:217:31ff:feb4:8d55"; var dest = sourceStr.match(reg); if (dest) alert(dest[0]); Пример 4: Задача: замена переводов строки на пробелы Вход: произвольная текстовая строка (например из базы) в которой могут быть пробелы Выход: та же строка где символы перевода строк (\n\r или одиночный \n) заменяются на пробел var myRe = /(\n(\r)?)/g; var str = 'строка1 \n строка2 \n\r строка3 \n\r'; if (myRe.test(str)) { var result = str.replace(myRe, ' '); alert(result); } Пример 5: Задача: разбор имени, фамилии и отчества Вход: строка содержащая имя фимилию и отчество Выход: три строки, содержащие имя. фамилию и отчество var str = 'Иван Иванов Иванович'; var myRe = /([А-Яа-я]+)\s([А-Яа-я]+)\s([А-Яа-я]+)/; if (myRe.test(str)) { var ar = myRe.exec(str); alert('Имя: ' + ar[1] + ' Фамилия: ' + ar[2] + ' Отчество: ' + ar[3]); } Пример 6 Замена неправильных символов в имени файла /* Список некорректных символов для имени файла: "#", "%", "&", "{", "}", "\", "<", ">", "*", "?", "/", "s", "$", "!", ":", "@", "+", "|", "=" */ var reg = /[\#\%\&\{\}\\\<\>\*\?\/\s\$\!\:\@\+\|\=]/g; var badFileName = "!123 %%#{}|\/?*.txt"; var goodFileName = badFileName.replace(reg, "_"); alert(goodFileName); Пример 7 Замена всех символов, кроме разрешенных /* Список разрешенных символов: "a", "s", "D", "e", "c", "v", "b", "n" */ var reg = /[^asDecvbn]/g; var badStr = "fdgasyyrDnnb"; var goodStr = badStr.replace(reg, ""); alert(goodStr); Пример 8 Разбор даты и времени из лога /* Пример данных из Log-файла: 2016/12/27 11:48:14:527 [7672, 392] INFO Terminating: TCustomForm.Close{not HasOtherVisibleForms} 2016/12/27 11:48:14:528 [7672, 392] INFO Application.LastShowedForm: TNotifyView[] 2016/12/27 11:48:14:533 [7672,2288] INFO SendingThread::PING 2016/12/27 11:48:14:535 [7672,4684] INFO ReceivingThread::PONG 2016/12/27 11:48:14:540 [7672, 392] INFO close [node:19996385127421] 2016/12/27 11:48:14:656 [7672, 392] INFO FinalizePhenixKernel 2016/12/27 11:48:14:767 [7672,4684] INFO ReceivingThread normal exit 2016/12/27 11:48:14:797 [7672,2288] INFO SendingThread normal exit 2016/12/27 11:48:15:966 [7672, 392] INFO Конфигурация [70202972297322] не сохранена: нет подключения 2016/12/27 11:48:15:970 [7672, 392] INFO main exit */ var regDateTime = /(\d+\/\d+\/\d+\s\d+\:\d+\:\d+)/g; var regDate = /(\d+\/\d+\/\d+)/g; var regTime = /(\d+\:\d+\:\d+)/g; var file = FileSystem.openTextFile("e:/example/log.txt"); try { while (!file.eof) { var line = Strings.trimAll(file.readLine()); if (!line) continue; var dateTimeStr = line.match(regDateTime); if (!dateTimeStr) continue; var date = dateTimeStr[0].match(regDate)[0].split("/"); var time = dateTimeStr[0].match(regTime)[0].split(":"); var year = date[0]; var month = date[1]; var day = date[2]; var hour = time[0]; var minute = time[1]; var second = time[2]; Log.writeLine("Результат разбора даты"); Log.writeLine("год: " + year + " месяц: " + month + " день: " + day); Log.writeLine("Результат разбора времени"); Log.writeLine("часы: " + hour + " минуты: " + minute + " секунды: " + second); } } finally { file.close(); } Пример 9 Замена ',' на ';' varreg = /\,/g; varsourceStr = "Это некоторая строка, содержащая символ ','"; vardestStr = sourceStr.replace(reg, ";"); alert(destStr); Пример 10 Распознавание телефонного номера varreg = /((8|\+7)[\- ]?)?(\(?\d{3,5}\)?[\- ]?)?[\d\- ]{5,10}/g; varsourceStr = "Данная строка содержит несколько номеров в разных форматах: " + "'+79261234567', " + "'89261234567', " + "'79261234567', " + "'+7 926 123 45 67', " + "'8(926)123-45-67', " + "'123-45-67', " + "'9261234567', " + "'79261234567', " + "'(495)1234567', " + "'(495) 123 45 67', " + "'89261234567', " + "'8-926-123-45-67', " + "'8 927 1234 234', " + "'8 927 12 12 888', " + "'8 927 12 555 12', " + "'+7 (4932) 23-08-64', " + "'8 927 123 8 123'"; varphones = null; while ((phones = reg.exec(sourceStr)) != null) Log.writeLine(phones[0]); Пример 11 Обработка ошибок phx.err Вычленение версий клиента и сервера, имени пользователя varphxErrStr = "2016/01/20 16:59:36:563 [3204,3976] ERROR v5.2.125/5.2.126 fav: Невозможно перенести узел[70202975761937] сам в себя" + "inform.adt.InformException: Невозможно перенести узел[70202975761937] сам в себя " + "inform.adt.InformException" + " at inform.agent.mtd.nodes.Node.changeParent(Node.java:1268)" + " at inform.agent.mtd.nodes.Node.changeParent(Node.java:1294)" + " at inform.agent.mtd.nodes.BasicNode.changeParent(BasicNode.java:882)" + " at inform.agent.mtd.request.ModifyNode.modifyNode(ModifyNode.java:92)..."; varreg = /(5\.2\.\d+)\/(5\.2\.\d+)\s([A-z0-9]+)/; varres = phxErrStr.match(reg); if (res) { Log.writeLine("Версия клиента: " + res[1]); Log.writeLine("Версия сервера: " + res[2]); Log.writeLine("Имя пользователя: " + res[3]); } Пример 12 Применение шаблона ${<выражение JS>} Данный пример показывает, как можно применять разные шаблоны для формирования выходных документов на основании одних и тех же данных. functionevaluate(context, evalStr) { with (context) returneval(evalStr); } functionapplyTemplate(template, contextObject) { returntemplate.replace(/\${([^}]+)}/g, function(_, expr) { returnevaluate(contextObject, expr); }); } functionjsTemplateRecognition() { /* Применение шаблона ${<выражение JS>} */ vartemplate1 = "Фирма '${name}' имеет контактый телефон '${phone}'"; vartemplate2 = "Наименование предприятия: ${name} \nКонтактный телефон: ${phone}"; //В данном примере объект record формируется вручную, но на практике может //формироваться на основе данных из таблицы varrecord = {}; record["name"] = "ООО Рога и копыта"; record["phone"] = "(4932) 12-34-56"; Log.writeLine(applyTemplate(template1, record)); Log.writeLine(applyTemplate(template2, record)); } |