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

Yuras

Client
Регистрация
05.01.2012
Сообщения
14
Благодарностей
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

Client
Регистрация
26.04.2020
Сообщения
409
Благодарностей
651
Баллы
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: обновил, теперь все нормально работает.
 
Последнее редактирование:

sergodjan66

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
18 172
Благодарностей
8 036
Баллы
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
Сообщения
14
Благодарностей
3
Баллы
3

Alexmd

Client
Регистрация
10.12.2018
Сообщения
917
Благодарностей
1 155
Баллы
93
Извините, но глаз ломается при виде разбора 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
Сообщения
229
Благодарностей
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

Client
Регистрация
26.04.2020
Сообщения
409
Благодарностей
651
Баллы
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
Сообщения
229
Благодарностей
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

Client
Регистрация
26.04.2020
Сообщения
409
Благодарностей
651
Баллы
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
Сообщения
917
Благодарностей
1 155
Баллы
93
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
Сообщения
371
Благодарностей
110
Баллы
43
Вроде простая задача, но застрял. Помогите, пожалуйста.

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

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

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

sergodjan66

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

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

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

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

Elfirich

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

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

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

если пишу

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

artsmm

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

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