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

Працюють вони через спеціальний об'єкт RegExp.

Крім того, у рядків є свої методи search, match, replace. але щоб їх зрозуміти - розберемо-таки спочатку RegExp.

Об'єкт типу RegExp. або, коротше, регулярний вираз, можна створити двома шляхами

pattern - регулярний вираз для пошуку (про заміну - пізніше), а прапори - рядок з будь-якої комбінації символів g (глобальний пошук), i (регістр не важлива) і m (багаторядковий пошук).

Перший спосіб використовується часто, другий - іноді. Наприклад, два таких виклику еквівалентні:

При другому виклик - т.к регулярне вираження в лапках, то потрібно дублювати \

При пошуку можна використовувати більшість можливостей сучасного PCRE-синтаксису.

Для звичайних символів - робить їх спеціальними. Наприклад, вираз / s / шукає просто символ 's'. А якщо поставити \ перед s, то / \ s / вже позначає пробільний сімвол.І навпаки, якщо символ спеціальний, наприклад *, то \ зробить його просто звичайним символом "зірочка". Наприклад, / a * / шукає 0 або більше поспіль символів 'a'. Щоб знайти а із зірочкою 'a *' - поставимо \ перед спец. символом: / a \ * /.

Позначає початок вхідних даних. Якщо встановлений прапор багаторядкового пошуку ( "m"). то також спрацює при початку нової строкі.Напрімер, / ^ A / не знайде 'A' в "an A", але знайде Перший 'A' в "An A."

Позначає кінець вхідних даних. Якщо встановлений прапор багаторядкового пошуку, то також спрацює в кінці строкі.Напрімер, / t $ / не знайде 't' в "eater", але знайде - в "eat".

Позначає повторення 0 або більше разів. Наприклад, / bo * / знайде 'boooo' в "A ghost booooed" і 'b' в "A bird warbled", але нічого не знайде в "A goat grunted".

Позначає повторення 1 або більше разів. Еквівалентно. Наприклад, / a + / знайде 'a' в "candy" і все 'a' в "caaaaaaandy".

(Десяткова точка) позначає будь-який символ, крім перекладу рядки: \ n \ r \ u2028 or \ u2029. (Можна використовувати [\ s \ S] для пошуку будь-якого символу, включаючи переклади рядків). Наприклад, /.n/ знайде 'an' і 'on' в "nay, an apple is on the tree", але не "nay '.

Знаходить x і запам'ятовує. Це називається "запам'ятовуючі дужки". Наприклад, / (foo) / знайде і запам'ятає 'foo' в "foo bar." Знайдена підрядок зберігається в масиві-результаті пошуку або в зумовлених властивості об'єкта RegExp: $ 1. $ 9 .Крім того, дужки об'єднують те, що в них знаходиться, в єдиний елемент патерну. Наприклад, (abc) * - повторення abc 0 і більше разів.

Знаходить x. але не запам'ятовує знайдене. Це називається "не запам'ятовуються дужки". Знайдена підрядок не зберігається в масиві результатів і властивості RegExp.Как і все дужки, об'єднують що знаходиться в них в єдиний подпаттерн.

Знаходить x. тільки якщо за x слід y. Наприклад, / Jack (? = Sprat) / знайде 'Jack', тільки якщо за ним слід 'Sprat'. / Jack (? = Sprat | Frost) / знайде 'Jack', тільки якщо за ним слід 'Sprat' або 'Frost'. Однак, ні 'Sprat' ні 'Frost' не ввійдуть в результат пошуку.

Знаходить x. тільки якщо за x не слід y. Наприклад, /\d+(?!\.)/ знайде число, тільки якщо за ним не слід десяткова крапка. /\d+(?!\.)/.exec("3.141 ") знайде 141, але не 3.141.

Знаходить x або y. Наприклад, / green | red / знайде 'green' в "green apple" та 'red' в "red apple."

Де n - позитивне ціле число. Знаходить рівно n повторення попереднього елемента. Наприклад, / a / не знайде 'a' в "candy," але знайде обидва a в "caandy," і перші два a в "caaandy."

Де n - позитивне ціле число. Знаходить n і більш повторень елемента. Наприклад, / a не знайде 'a' в "candy", але знайде все 'a' в "caandy" і в "caaaaaaandy."

Де n і m - позитивні цілі числа. Знаходять від n до m повторень елемента.

Набір символів. Знаходить будь-який з перелічених символів. Ви можете вказати проміжок, використовуючи тире. Наприклад, [abcd] - те ж саме, що [a-d]. Чи знайде 'b' в "brisket", а також "a 'і' c 'в" ache ".

Будь-який символ, крім зазначених у наборі. Ви також можете вказати проміжок. Наприклад, [^ abc] - те ж саме, що [^ a-c]. Чи знайде 'r' в "brisket" і "h" в "chop."

Знаходить символ backspace. (Не плутати з \ b.)

Знаходить кордон слів (латинських), наприклад пробіл. (Не плутати з [\ b]). Наприклад, / \ bn \ w / знайде 'no' в "noonday"; / \ Wy \ b / знайде 'ly' в "possibly yesterday."

Позначає не кордон слів. Наприклад, / \ w \ Bn / знайде 'on' в "noonday", а / y \ B \ w / знайде 'ye' в "possibly yesterday."

Де X - буква від A до Z. Позначає контрольний символ в рядку. Наприклад, / \ cM / позначає символ Ctrl-M.

знаходить цифру з будь-якого алфавіту (у нас же юнікод). Іспльзуется [0-9], щоб знайти тільки звичайні цифри. Наприклад, / \ d / або / [0-9] / знайде '2' в "B2 is the suite number."

Чи знайде нецифровий символ (всі алфавіти). [^ 0-9] - еквівалент для звичайних цифр. Наприклад, / \ D / або / [^ 0-9] / знайде 'B' в "B2 is the suite number."

Відповідні спецсимволи form-feed, line-feed, переклад рядка.

Знайде будь символ пробілу, включаючи пробіл, табуляцію, переклади рядки та інші Юнікодние пробільні символи. Наприклад, / \ s \ w * / знайде 'bar' в "foo bar."

Чи знайде будь-який символ, крім пробільних. Наприклад, / \ S \ w * / знайде 'foo' в "foo bar."

Якщо в регулярному виразі включений прапор "g", Ви можете викликати метод exec багато разів для пошуку послідовних збігів у тому ж рядку. Коли Ви це робите, пошук починається на підрядку str. з індексу lastIndex. Наприклад, ось такий скрипт:

Цей скрипт виведе наступний текст:

У наступному прикладі функція виконує пошук по input. Потім робиться цикл по масиву, щоб подивитися, чи є інші імена.

Передбачається, що всі зареєстровані імена знаходяться в масиві А:

Наступні методи працюють з регулярними виразами з рядків.

Всі методи, крім replace, можна викликати як з об'єктами типу regexp в аргументах, так і з рядками, які автоматом перетворюються в об'єкти RegExp.

Так що виклики еквівалентні:

При використанні лапок потрібно дублювати \ і немає можливості вказати прапори. Якщо регулярний вираз вже задано рядком, то буває зручна і повна форма

Повертає індекс регулярного вираження в рядку, або -1.

Якщо Ви хочете знати, чи підходить рядок під регулярний вираз, використовуйте метод search (аналогічно RegExp-методи test). Щоб отримати більше інформації, використовуйте більш повільний метод match (аналогічний методу RegExp exec).

Цей приклад виводить повідомлення, в залежності від того, чи підходить рядок під регулярний вираз.

Якщо в regexp немає прапора g. то повертає той же результат, що regexp.exec (string).

Якщо в regexp є прапор g. то повертає масив з усіма збігами.

Щоб просто дізнатися, чи підходить рядок під регулярний вираз regexp. використовуйте regexp.test (string).

Якщо Ви хочете отримати перший результат - спробуйте r egexp.exec (string).

У наступному прикладі match використовується, щоб знайти "Chapter", за якою слідує 1 або більше цифр, а потім цифри, розділені крапкою. У регулярному виразі є прапор i. так що регістр буде ігноруватися.

Скрипт видасть масив з збігів:

  • Chapter 3.4.5.1 - повністю збіглася рядок
  • 3.4.5.1 - перша дужка
  • .1 - внутрішня дужка

Наступний приклад демонструє використання прапорів глобального і регістронезавісімого пошуку з match. Будуть знайдені всі літери від А до Е і від а до е, кожна - в окремому елементі масиву.

Метод replace може заміняти входження регулярного вираження не тільки на рядок, а й на результат виконання функції. Його повний синтаксис - такий:

regexp Об'єкт RegExp. Його входження будуть замінені на значення, яке поверне параметр номер 2 substr Рядок, яка буде замінена на newSubStr. newSubStr Рядок, яка замінює підрядок з аргументу номер 1. function Функція, яка може бути викликана для генерації нової підрядка (щоб підставити її замість підрядка, отриманої з аргументу 1).

Метод replace не змінює рядок, на якій викликаний, а просто повертає нову, змінену рядок.

Щоб здійснити глобальну заміну, включіть в регулярний вираз прапор "g".

Якщо перший аргумент - рядок, то вона не перетвориться в регулярний вираз, так що, наприклад,

Виклик replace залишив рядок без зміни, т.к шукати не регулярний вираз \ s. а рядок "\ s".

У рядку заміни можуть бути такі спецсимволи:

Де n або nn - десяткові цифри, вставляє підрядок входження, запомненную n -й вкладеної дужкою, якщо перший аргумент - об'єкт RegExp.

Якщо Ви вказуєте другим параметром функцію, то вона виконується при кожному збігу.

У функції можна динамічно генерувати і повертати рядок підстановки.

Перший параметр функції - знайдений підрядок. Якщо першим аргументом replace є об'єкт RegExp. то наступні n параметрів містять збіги з вкладених дужок. Останні два параметри - позиція в рядку, на якій відбулося збіг і сама рядок.

Наприклад, наступний виклик replace поверне XXzzzz - XX. zzzz.

Як бачите, тут дві дужки в регулярному виразі, і тому в функції два параметри p1. p2.
Якби були три дужки, то в функцію довелося б додати параметр p3.

Наступна функція замінює слова типу borderTop на border-top:

За стандартом ця можливість дозволена ES3, але заборонена ES5.

Через те, що lastIndex при глобальному пошуку змінюється, а сам об'єкт регекспа статичний, перший пошук збільшує lastIndex. а наступні - продовжують шукати зі старого lastIndex. тобто можуть повертати не всі результати.

При пошуку всіх збігів в циклі проблем не виникає, тому що остання ітерація (невдала) обнуляє lastIndex.

Для загального розуміння регулярних виразів можна почитати Статтю в wikipedia.

Дійсно - дуже прикро що немає непоглощающіх пошуку назад
це фундаментальна з моєї точки зору поняття.
Наприклад, я б не хотів би включати в результат знаходження то, що було потрібно для перевірки йде до самого знаходження, і це дуже до речі при заміні replace.
А взагалі я хотів би щоб replace було не тільки для рядка знаходження $ 0, але і для кожного кишені окремо: від $ 0 і до $ n, тобто щоб крім параметра рядка заміни в методі replace, були рядки заміни для кожного кишені.

Ось тут дивлюся ваше керівництво
Набір символів. Знаходить будь-який з перелічених символів. Ви можете вказати проміжок, використовуючи тире. Наприклад, [abcd] - те ж саме, що [a-d]. Чи знайде 'b' в "brisket" і "c" в "ache".

Є рядок складається з натуральних чисел, розділена ","
треба перетворити в масив.
Приклад (працює) якщо ми знаємо розмірність масиву
var a = /(\d+)[\,](\d+)[\,](\d+)[\,](\d+)/.exec("10,150,0,1230 ");
alert ( "a [0] =" + a [0] + '\ n' +
"A [1] =" + a [1] + '\ n' +
"A [2] =" + a [2] + '\ n' +
"A [3] =" + a [3] + '\ n' +
"A [4] =" + a [4]
);

Якщо ми не знаємо розмірності масиву (числа натуральних рядків в рядку)
Приклад (типу) (НЕ ПРАЦЮЄ):
var a = /(\d+)[[\,](\d+)]*/.exec("10,150,0,1230,11,1234 ");
Чи можна обійтися без додаткового циклу (тільки регулярним виразом)?

Допоможіть з правильністю вираження.

тобто 6 пар символів з обмеженням: цифри від 0 до 9 або лат. букви від A до F, розділені двокрапкою.

1) чи не помилився я в коді?
2) чи правильно складено патерн -
а то є ось такий варіант - не знаю чим він відрізняється і чи підходить
/ ^ \ S * ([\ d [A-F]:) [\ d [A-F] \ s * $ /

Хлопці, потрібна допомога.
в поле input вставляю рядок містить якийсь перенесення рядка, наприклад з цього ж розділу скопіювати рядок коду "var myArray = myRe.exec (" cdbBdbsbz ");
". І в input виходять 2 рядки, так ось цього не повинно бути, потрібно в рядок.
Пишу наступне регулярний вираз:

$ ( 'Input.search_fild'). Change (function () var enter = $ (this) .val ();
var newString = enter.replace (/ \ r \ n /, / \ s /);
alert (newString);
>);

тобто міняю перенесення рядка на пробіл. Та це не спрацьовує, все одно в input 2 рядки.
Для перевірки робив:

$ ( 'Input.search_fild'). Change (function () var enter = $ (this) .val ();
var newString = enter.replace (/ абв /, "1");
alert (newString);
>);

в input писав "абв" - працює, змінюється на "1".
P.s. До речі change відпрацьовує після втрати фокусу інпут, а як на льоту?

є одна чудова річ для роботи з регулярки - RegexBuddy. Під рукою, вибачте, немає ні посилання, ні самої штуки. Але кому не лінь, раджу придивитися. Містить в собі підсвічування регулярки, інструменти для тестів, приклади для безлічі мов + бібліотеку самих часто використовуваних регулярок

Є рядок, якщо зовсім спрощено, то виглядає вона як "aba"
Небхідно знаходити в цьому рядку все: "ab" і "ba".
Оскільки індекс з якого починати наступний пошук росте в даному прикладі буде знайдено або "ab" або "ba", але в даному прикладі результатом пошуку необхідно отримувати обидва значення тобто "ab" і "ba", а не одне з них. Чи є якесь витончене рішення в регулярних виразах для такого типу пошуку без циклів і інших надбудов?
Природно приклад спрощений до неподобства, в реальності рядок в якій потрібно шукати всі можливі варіанти значно більше і шукані значення значно складніше. Або може бути можна як-небудь керувати lastIndex'ом (індекс, з якого починати наступний пошук)?
P.S. я не шукаю рішення даного питання тому нагромадити я вмію і без чужої допомоги =), я швидше за шукаю витончене (короткий і просте) рішення або метод який мені невідомий (якщо що пропустив в статті, то заздалегідь прошу вибачення).

Доброго вам дня!

Підкажіть будь ласка, як правильно написати регулярне викладені для пошуку певного входження рядка всередині розмітки.

Ось приклад розмітки:

ABCDEFG nbsp Scenario:

А ось те як це виглядає для користувача:
Scenario:
ABCDEFG Scenario:

Мені приходить рядок з розміткою і потрібно певним чином відформатувати рядок "Scenario:", якщо вона знаходиться на початку рядка, якщо ж перед це рядком передують будь-які інші символи, то рядок не повинна бути знайдена. При цьому всі попередні знаки пробілів повинні бути збережені.
У першому випадку мені потрібно знайти рядок "Scenario:", тому що візуально вона знаходиться на початку рядка перед якою передують кілька прогалин. У другому ж випадку рядок "Scenario:" не повинна бути знайдена, тому що перед цим рядком передують символи "ABCDEFG".

Буду дуже вдячна, якщо ви мені допоможете вирішити цю задачку

Доброго вам дня!

Підкажіть будь ласка, як правильно написати регулярне викладені для пошуку певного входження рядка всередині розмітки.

Ось приклад розмітки:

Scenario:


ABCDEFG nbsp Scenario:

А ось те як це виглядає для користувача:

Мені приходить рядок з розміткою і потрібно певним чином відформатувати рядок "Scenario:", якщо вона знаходиться на початку рядка, якщо ж перед це рядком передують будь-які інші символи, то рядок не повинна бути знайдена. При цьому всі попередні знаки пробілів повинні бути збережені.
У першому випадку мені потрібно знайти рядок "Scenario:", тому що візуально вона знаходиться на початку рядка перед якою передують кілька прогалин. У другому ж випадку рядок "Scenario:" не повинна бути знайдена, тому що перед цим рядком передують символи "ABCDEFG".

Буду дуже вдячна, якщо ви мені допоможете вирішити цю задачку

Схожі статті