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

Всем привет!
Есть код такого вида:
{"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
Всем привет!
Есть код такого вида:
{"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: обновил, теперь все нормально работает.
 
Последнее редактирование:
@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 должен быть текст в котором ищем.
 
Последнее редактирование:
Извините, но глаз ломается при виде разбора 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;
 
Последнее редактирование:
Здравствуйте! реально ли спарсить регуляркой ВЛЕВО\ВВЕРХ от заданого текста. Например

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
 
Здравствуйте! реально ли спарсить регуляркой ВЛЕВО\ВВЕРХ от заданого текста. Например

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
 
@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"] + "";

не работает, что я делаю не так?
 
не могу сюда вставить переменную с шаблона
C#:
Развернуть Свернуть Копировать
string pattern = @"(?<=""autoId"":).*(?=" + project.Variables["temp_id"] + "";

не работает, что я делаю не так?
Надо было добавить к переменной .Value, чтобы получить значение из неё.
C#:
Развернуть Свернуть Копировать
string pattern = @"(?<=""autoId"":).*(?=" + project.Variables["temp_id"].Value + "";
 
  • Спасибо
Реакции: Sergey1005, Sho и maryan
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
Вроде простая задача, но застрял. Помогите, пожалуйста.

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

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

Пробовал .* но не работает
 
Вроде простая задача, но застрял. Помогите, пожалуйста.

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

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

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

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

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

если пишу

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

Вложения

  • Спасибо
Реакции: CmauJluk
С таких ссылок почему то не получается скачать фото
Проверил, получающиеся ссылки на выходе этого примера шаблона - валидные, в браузере открываются картинки.
Проблем со скачиванием не должно возникать.
Каким образом вы скачиваете?

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

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
Проверил, получающиеся ссылки на выходе этого примера шаблона - валидные, в браузере открываются картинки.
Проблем со скачиванием не должно возникать.
Каким образом вы скачиваете?

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

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
 
Блин все кажется понял косяк
 
Через гет как обычно, но у меня почему то ссылки другого формата получаются Посмотреть вложение 103215
Блин все кажется понял косяк
В моем примере есть кубик для декодирования - приведения ссылок в нормальный вид.
В этом дело было?
 
  • Спасибо
Реакции: CmauJluk
Может кто-нибудь помочь? Как с помощью replace оставить слово, которое идёт после # и при этом, чтобы остальные последующие слова с # тоже удалялись?
Например: Из этого #текста нужно чтобы осталось только одно #слово
Результат: #текста
Слова после # могут быть рандомными
 
Может кто-нибудь помочь? Как с помощью replace оставить слово, которое идёт после # и при этом, чтобы остальные последующие слова с # тоже удалялись?
Например: Из этого #текста нужно чтобы осталось только одно #слово
Результат: #текста
Слова после # могут быть рандомными
Регулярка: \#.*?(?=\ )

103320
 
А с помощью replace возможно сделать?
Нужно именно заменить весь остальной текст, не выдергивая ничего
Можете в кубике результат сохранять в эту же переменную, которая на входе стоит, тогда будет практически как Замена.
 

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