Ни как не получается дописать регулярку

309
03 декабря 2017, 14:43

Есть текст:

[asdasd|asda sdas] asdasd fneughwegh [4ghehrh|gfebgubegoe] sdfsdfsf

Мне нужно получить из него:

[asdasd|asda sdas]
[4ghehrh|gfebgubegoe]

Я написал вот такую регулярку: \[.*\|.*\]

Она возвращает вот это: [asdasd|asda sdas] asdasd fneughwegh [4ghehrh|gfebgubegoe]

Т.е. берет первую скобку, и последнюю. Почему?

Answer 1

без подробностей пока так:

var str = '[asdasd|asdasdas] asdasd fneughwegh [4ghehrh|gfebgubegoe] sdfsdfsf'; 
var re = /(\[[^\s]+\|[^\s]+\])/gi; 
var found = str.match(re); 
 
console.log(found);

то есть предполагаю, что внутри скобок нет пробелов, а остальные символы разрешены

если пробелы нужны:

var str = '[asd asd|asda sdas] asdasd fneughwegh [4ghehrh|gfebgubegoe] sdfsdfsf'; 
var re = /(\[.*?\|.*?\])/gi; 
var found = str.match(re); 
 
console.log(found);

Проблема описана в википедии:

В некоторых реализациях квантификаторам в регулярных выражениях соответствует максимально длинная строка из возможных (квантификаторы являются жадными, англ. greedy). Это может оказаться значительной проблемой. Например, часто ожидают, что выражение (<.*>) найдёт в тексте теги HTML. Однако если в тексте есть более одного HTML-тега, то этому выражению соответствует целиком строка, содержащая множество тегов.

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

Эту проблему можно решить двумя способами.

  1. Учитывать символы, не соответствующие желаемому образцу (<[^>]*> для вышеописанного случая).
  2. Определить квантификатор как нежадный (ленивый, англ. lazy) — большинство реализаций позволяют это сделать, добавив после него знак вопроса.
Жадный | Ленивый
  *    |   *?
  +    |   +?
 {n,}  |  {n,}?
READ ALSO
Передача props, как параметра в функцию в React

Передача props, как параметра в функцию в React

Есть компонент, в который входят 2 других компонента: кнопки и блок, кнопок несколько, и при нажатии на кнопку, блок должен принимать ее цветНе...

482
Angular 4 на работает router после отправки запроса

Angular 4 на работает router после отправки запроса

Пытаюсь обойти это баг уже более суток без снаПосле того как я отправляю внешний запрос то важная onInit перестает вызываться у компонентов...

313
Как сделать, чтобы скрипт выполнялся при определнных разрешениях экрана?

Как сделать, чтобы скрипт выполнялся при определнных разрешениях экрана?

Добрый день мне необходимо чтобы этот скрипт выполнялся при заходе с мобильного

435
mousemove действие

mousemove действие

Хочу сделать скрипт, чтобы сдвинув мышь на определенное количество пикселей вниз выполнялся внутренний скрипт

189