Регулярные выражения на все случаи жизни

Yuras

Client
Регистрация
05.01.2012
Сообщения
15
Благодарностей
3
Баллы
3
Всем привет!
Есть код такого вида:
{"src":"https:\/\/static.baza.farpost.ru\/v\/1624325689953_default","alt":"Lexus GS300 фото","label":"","isUnavailable":false,"msrc":"https:\/\/static.baza.farpost.ru\/v\/1624325689953_bulletin","private":false,"height":640,"width":640,"isMain":false},{"src":"https:\/\/static.baza.farpost.ru\/v\/1624325677098_default","alt":"Lexus GS300 фото","label":"","isUnavailable":false,"msrc":"https:\/\/static.baza.farpost.ru\/v\/1624325677098_bulletin","private":false,"height":640,"width":640,"isMain":true},{"src":"https:\/\/static.baza.farpost.ru\/v\/1669343438249_default","alt":"Lexus GS300 фото","label":"","isUnavailable":false,"msrc":"https:\/\/static.baza.farpost.ru\/v\/1669343438249_bulletin","private":false,"height":640,"width":640,"isMain":false}
Мне нужно получить только 1624325677098
Это в блоке, где "isMain":true".
Я пробовал сначала регуляркой:
(?<=static\.baza\.farpost\.ru\\/v\\/).*?(?=isMain":true})
самым коротким совпадением сначала спарсить от 1624325677098 до конца, чтобы потом второй регуляркой взять от начала до символа "_"
Но получаю первое число 1624325689953

Помогите с регуляркой, пожалуйста!
З.Ы. искомый блок может быть любым по счету, потому по номеру вхождения не зацепиться.
 
Последнее редактирование:
  • Спасибо
Реакции: Sho

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
Всем привет!
Есть код такого вида:
{"src":"https:\/\/static.baza.farpost.ru\/v\/1624325689953_default","alt":"Lexus GS300 фото","label":"","isUnavailable":false,"msrc":"https:\/\/static.baza.farpost.ru\/v\/1624325689953_bulletin","private":false,"height":640,"width":640,"isMain":false},{"src":"https:\/\/static.baza.farpost.ru\/v\/1624325677098_default","alt":"Lexus GS300 фото","label":"","isUnavailable":false,"msrc":"https:\/\/static.baza.farpost.ru\/v\/1624325677098_bulletin","private":false,"height":640,"width":640,"isMain":true},{"src":"https:\/\/static.baza.farpost.ru\/v\/1669343438249_default","alt":"Lexus GS300 фото","label":"","isUnavailable":false,"msrc":"https:\/\/static.baza.farpost.ru\/v\/1669343438249_bulletin","private":false,"height":640,"width":640,"isMain":false}
Мне нужно получить только 1624325677098
Это в блоке, где "isMain":true".
Я пробовал сначала регуляркой:
(?<=static\.baza\.farpost\.ru\\/v\\/).*?(?=isMain":true})
самым коротким совпадением сначала спарсить от 1624325677098 до конца, чтобы потом второй регуляркой взять от начала до символа "_"
Но получаю первое число 1624325689953

Помогите с регуляркой, пожалуйста!
З.Ы. искомый блок может быть любым по счету, потому по номеру вхождения не зацепиться.
Привет! :bs:
Если правильно все понял, то вот:
(?<=\/)[0-9]+(?=_default.+,"isMain":true})

Ссылка с примером

upd: обновил, теперь все нормально работает.
 
Последнее редактирование:

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113
@Yuras

Можно, как еще один вариант, производить поиск по регулярке справа-налево, вот пример:
C#:
//регулярка
string pattern = @"(?<=static\.baza\.farpost\.ru\\/v\\/).*?(?=isMain..true)";

//обычный поиск - слева-направо
//Regex reg = new Regex(pattern);

//замена направления поиска - справа-налево
Regex reg = new Regex(pattern, RegexOptions.RightToLeft);

return reg.Match(project.Variables["textsource"].Value).Value;
В переменной textsource должен быть текст в котором ищем.
 
Последнее редактирование:

Yuras

Client
Регистрация
05.01.2012
Сообщения
15
Благодарностей
3
Баллы
3
Последнее редактирование:

Yuras

Client
Регистрация
05.01.2012
Сообщения
15
Благодарностей
3
Баллы
3

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
Извините, но глаз ломается при виде разбора json регулярками. Хоть проблема вроде бы и решена, но я не смог пройти мимо и не вставить свои ржавые пару копеек.
Очевидно же, что у нас в тексте три простых массива json. Элементарной регуляркой можно их выделить в список, а потом распарсить каждый json и в нем уже проверить необходимые условия и не ошибиться с выбором числа.
Все это также можно сделать на кубиках и работать оно будет надежнее, чем такая регулярка, которая живет до ближайших изменений внутри каждого массива со стороны сайта.
Я бы сделал так:
C#:
MatchCollection mc = Regex.Matches(project.Variables["переменная"].Value,@"\{.*?}");//собираю json в список
for(int i = 0; i < mc.Count; i++){//в цикле пробегаюсь по списку
    project.Json.FromString(mc[i].Value);//парсинг json
    if(project.Json.isMain){//проверка на isMain
        return Regex.Match(project.Json.src, @"(?<=/)\d.*?(?=_)").Value;//парсинг id
    }
}
или так :
C#:
return Regex.Match(
    (string)Regex.Matches(project.Variables["переменная"].Value,@"\{.*?}")
    .Cast<Match>()
    .Select(x=>(dynamic)Global.ZennoLab.Json.JsonConvert.DeserializeObject(x.Value))
    .Where(x=>x.isMain)
    .First().src,
    @"(?<=/)\d.*?(?=_)").Value;
 
Последнее редактирование:

maryan

Client
Регистрация
04.07.2014
Сообщения
230
Благодарностей
40
Баллы
28
Здравствуйте! реально ли спарсить регуляркой ВЛЕВО\ВВЕРХ от заданого текста. Например

user_id="1111",user_id="1111",user_id="1111",user_id="1111",user_id="3333",name="Nick"

Как взять текст "3333", если у нас есть только "Nick"

То есть регулярка
(?<=user_id=").*?(?=Nick)
берет все подряд и результат будет
1111",user_id="1111",user_id="1111",user_id="1111",user_id="3333",name="
а надо 3333, то есть нужно взять вариант поближе к Nick
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
Здравствуйте! реально ли спарсить регуляркой ВЛЕВО\ВВЕРХ от заданого текста. Например

user_id="1111",user_id="1111",user_id="1111",user_id="1111",user_id="3333",name="Nick"

Как взять текст "3333", если у нас есть только "Nick"

То есть регулярка
(?<=user_id=").*?(?=Nick)
берет все подряд и результат будет
1111",user_id="1111",user_id="1111",user_id="1111",user_id="3333",name="
а надо 3333, то есть нужно взять вариант поближе к Nick
Привет. Реально.
Ответ дали выше → ссылка на сообщение от @sergodjan66
 

maryan

Client
Регистрация
04.07.2014
Сообщения
230
Благодарностей
40
Баллы
28
@Yuras

Можно, как еще один вариант, производить поиск по регулярке справа-налево, вот пример:
C#:
//регулярка
string pattern = @"(?<=static\.baza\.farpost\.ru\\/v\\/).*?(?=isMain..true)";

//обычный поиск - слева-направо
//Regex reg = new Regex(pattern);

//замена направления поиска - справа-налево
Regex reg = new Regex(pattern, RegexOptions.RightToLeft);

return reg.Match(project.Variables["textsource"].Value).Value;
В переменной textsource должен быть текст в котором ищем.
не могу сюда вставить переменную с шаблона
C#:
string pattern = @"(?<=""autoId"":).*(?=" + project.Variables["temp_id"] + "";
не работает, что я делаю не так?
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
не могу сюда вставить переменную с шаблона
C#:
string pattern = @"(?<=""autoId"":).*(?=" + project.Variables["temp_id"] + "";
не работает, что я делаю не так?
Надо было добавить к переменной .Value, чтобы получить значение из неё.
C#:
string pattern = @"(?<=""autoId"":).*(?=" + project.Variables["temp_id"].Value + "";
 
  • Спасибо
Реакции: Sergey1005, Sho и maryan

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
C#:
string text = project.Variables["var1"].Value;
string nick = project.Variables["var2"].Value;
return string.Join("", text.Split(',').TakeWhile(x=>!x.Contains(nick)).Last().Where(x=>char.IsDigit(x)));
 
  • Спасибо
Реакции: djaga

Hannes

Client
Регистрация
03.02.2016
Сообщения
527
Благодарностей
273
Баллы
63
Вроде простая задача, но застрял. Помогите, пожалуйста.

Искомый текст начинается с:
{"id":559395,"bids":[{"type":"countries"

вместо 559395 каждый раз новый ID (цифровой, букв нет). Что можно подставить в регулярку, чтобы она эти цифры пропускала?

Пробовал .* но не работает
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113
Вроде простая задача, но застрял. Помогите, пожалуйста.

Искомый текст начинается с:
{"id":559395,"bids":[{"type":"countries"

вместо 559395 каждый раз новый ID (цифровой, букв нет). Что можно подставить в регулярку, чтобы она эти цифры пропускала?

Пробовал .* но не работает
Попробуйте \d+ подставлять вместо номера.
 
  • Спасибо
Реакции: Sho и Hannes

Elfirich

Client
Регистрация
13.11.2018
Сообщения
27
Благодарностей
30
Баллы
13
Всем привет. Подскажите плиз, как правильно пользоваться операторами ? OR и AND

Хочу взять из списка строки удовлетворяющие регулярному выражению

текст1 ИЛИ текст2 И текст3 ИЛИ текст4 И текст5 ИЛИ текст6

если пишу

текст1|текст2&&текст3|текст4&&текст5|текст6
То что-то не то получается, оператор "и" не пашет.
Или как мне по-другому взять строку, которая содержит 3-и значения, которые могут находится как последовательно, так и вперемешку ?
 
Последнее редактирование:

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Приветствую.
Попробуйте так:
C#:
(текст1|(?<=текст2) текст3|(?<=текст4) текст5|текст6)
или так:
C#:
((текст1)|(текст2(?=текст3))|(текст4(?=текст5))|(текст6))
Не проверял, на вскидку написал.
Обычно - "или" через черту "красное|белое" а "и" можно так попробовать "(?<=красное).*(?=белое)", тк не нашел спец символа для конструкции "и". Кавычки не нужно
 

CmauJluk

Client
Регистрация
25.12.2017
Сообщения
287
Благодарностей
60
Баллы
28
Может кто помочь регуляркой для получения ссылок на яндекс картинках
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113

Вложения

  • Спасибо
Реакции: CmauJluk

CmauJluk

Client
Регистрация
25.12.2017
Сообщения
287
Благодарностей
60
Баллы
28

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113
С таких ссылок почему то не получается скачать фото
Проверил, получающиеся ссылки на выходе этого примера шаблона - валидные, в браузере открываются картинки.
Проблем со скачиванием не должно возникать.
Каким образом вы скачиваете?

Пример получившихся ссылок на выходе примера шаблона:

C#:
http://placepic.ru/wp-content/uploads/2022/10/catnip-4.jpg
http://avatars.dzeninfra.ru/get-zen_doc/1586459/pub_5fb6b0140a790b7b9817591b_5fca81068f8c7853ed016e19/scale_1200
http://wp-s.ru/wallpapers/5/16/477263606629260/kot-koshka-kotenok-v-chashe.jpg
 
  • Спасибо
Реакции: CmauJluk

CmauJluk

Client
Регистрация
25.12.2017
Сообщения
287
Благодарностей
60
Баллы
28
Проверил, получающиеся ссылки на выходе этого примера шаблона - валидные, в браузере открываются картинки.
Проблем со скачиванием не должно возникать.
Каким образом вы скачиваете?

Пример получившихся ссылок на выходе примера шаблона:

C#:
http://placepic.ru/wp-content/uploads/2022/10/catnip-4.jpg
http://avatars.dzeninfra.ru/get-zen_doc/1586459/pub_5fb6b0140a790b7b9817591b_5fca81068f8c7853ed016e19/scale_1200
http://wp-s.ru/wallpapers/5/16/477263606629260/kot-koshka-kotenok-v-chashe.jpg
Через гет как обычно, но у меня почему то ссылки другого формата получаются Снимок экрана 2023-02-11 144959.png
 

CmauJluk

Client
Регистрация
25.12.2017
Сообщения
287
Благодарностей
60
Баллы
28
Блин все кажется понял косяк
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113
Через гет как обычно, но у меня почему то ссылки другого формата получаются Посмотреть вложение 103215
Блин все кажется понял косяк
В моем примере есть кубик для декодирования - приведения ссылок в нормальный вид.
В этом дело было?
 
  • Спасибо
Реакции: CmauJluk

CmauJluk

Client
Регистрация
25.12.2017
Сообщения
287
Благодарностей
60
Баллы
28

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113

CmauJluk

Client
Регистрация
25.12.2017
Сообщения
287
Благодарностей
60
Баллы
28

Nichoj

Новичок
Регистрация
15.02.2023
Сообщения
3
Благодарностей
0
Баллы
1
Может кто-нибудь помочь? Как с помощью replace оставить слово, которое идёт после # и при этом, чтобы остальные последующие слова с # тоже удалялись?
Например: Из этого #текста нужно чтобы осталось только одно #слово
Результат: #текста
Слова после # могут быть рандомными
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113
Может кто-нибудь помочь? Как с помощью replace оставить слово, которое идёт после # и при этом, чтобы остальные последующие слова с # тоже удалялись?
Например: Из этого #текста нужно чтобы осталось только одно #слово
Результат: #текста
Слова после # могут быть рандомными
Регулярка: \#.*?(?=\ )

103320
 

Nichoj

Новичок
Регистрация
15.02.2023
Сообщения
3
Благодарностей
0
Баллы
1

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 116
Баллы
113
А с помощью replace возможно сделать?
Нужно именно заменить весь остальной текст, не выдергивая ничего
Можете в кубике результат сохранять в эту же переменную, которая на входе стоит, тогда будет практически как Замена.
 

Nichoj

Новичок
Регистрация
15.02.2023
Сообщения
3
Благодарностей
0
Баллы
1

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)