Skip to content

Greedy and lazy quantifiers #450

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

The result is: `match:123 4`.
Результат: `match:123 4`.

First the lazy `pattern:\d+?` tries to take as little digits as it can, but it has to reach the space, so it takes `match:123`.
Для початку, лінивий `pattern:\d+?` намагається взяти мінімальну можливу кількість цифр, але він має дійти до пробілу, тож обирається `match:123`.

Then the second `\d+?` takes only one digit, because that's enough.
Далі, другий `\d+?` обере лише одну тему, бо цього достатньо.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# A match for /d+? d+?/
# Збіг для /d+? d+?/

What's the match here?
Який результат ми отримаємо?

```js
alert( "123 456".match(/\d+? \d+?/g) ); // ?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
We need to find the beginning of the comment `match:<!--`, then everything till the end of `match:-->`.
Нам потрібно знайти початок коментарю `match:<!--`, та весь контент до кінця `match:-->`.

An acceptable variant is `pattern:<!--.*?-->` -- the lazy quantifier makes the dot stop right before `match:-->`. We also need to add flag `pattern:s` for the dot to include newlines.
Прийнятним є варіант `pattern:<!--.*?-->` -- лінивий квантифікатор зупиняє крапку прямо перед `match:-->`. Нам також треба додати прапор `pattern:s`, аби крапка включала символи нового рядку.

Otherwise multiline comments won't be found:
Інакше коментарі на кілька рядків не знаходитимуться:

```js run
let regexp = /<!--.*?-->/gs;

let str = `... <!-- My -- comment
let str = `... <!-- Мій -- коментар
test --> .. <!----> ..
`;

alert( str.match(regexp) ); // '<!-- My -- comment \n test -->', '<!---->'
alert( str.match(regexp) ); // '<!-- Мій -- коментар \n test -->', '<!---->'
```
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# Find HTML comments
# Знайти HTML коментарі

Find all HTML comments in the text:
Знайти всі HTML коментарі в тексті:

```js
let regexp = /your regexp/g;
let regexp = /ваш регулярний вираз/g;

let str = `... <!-- My -- comment
let str = `... <!-- Мій -- коментар
test --> .. <!----> ..
`;

alert( str.match(regexp) ); // '<!-- My -- comment \n test -->', '<!---->'
alert( str.match(regexp) ); // '<!-- Мій -- коментар \n test -->', '<!---->'
```
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

The solution is `pattern:<[^<>]+>`.
Відповідь: `pattern:<[^<>]+>`.

```js run
let regexp = /<[^<>]+>/g;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# Find HTML tags
# Знайти HTML теги

Create a regular expression to find all (opening and closing) HTML tags with their attributes.
Створити регулярний вираз для пошуку всіх (відкриваючих та закриваючих) HTML тегів з їх атрибутами.

An example of use:
Приклад використання:

```js run
let regexp = /your regexp/g;
let regexp = /ваш регулярний вираз/g;

let str = '<> <a href="/"> <input type="radio" checked> <b>';

alert( str.match(regexp) ); // '<a href="/">', '<input type="radio" checked>', '<b>'
```

Here we assume that tag attributes may not contain `<` and `>` (inside quotes too), that simplifies things a bit.
Тут ми припускаємо, що атрибути тегу не містять `<` та `>` (внутрішні лапки) для спрощення задачі.
Loading