Регулярное выражение для последовательности цифр после второго попавшегося символа + (плюс)

Подскажите, пожалуйста, как составить регулярное выражение для поиска последовательности цифр начиная со второго попавшегося символа "+" до последующего за ним слеша (не включая их).

Например, +укккк+34343434/edgege должно вернуть 34343434.

\+([\s\S]+?)\/ - такая конструкция возвращает все от первого плюса до слеша.

Поскольку после второго попавшегося плюса у меня всегда идут числа, то сработало \+([0-9]+?)\/.


Ответы (3 шт):

Автор решения: svm
(?<=\+[^+]*\+)[^/]+

Наглядный пример: https://regex101.com/r/sDPKvb/1

Работать будет не везде из-за ретроспективной проверки (?<=…).

Если это важно, можно использовать следующую регулярку:

(?:\+[^+]*){1}\+([^\/]+)

Но тогда надо будет использовать функции замены.
Наглядный пример тут: https://regex101.com/r/lRODjI/1

→ Ссылка
Автор решения: Андрей NOP

Используйте выражение \+[^+]*\+([^\/]*)\/, в случае совпадения возьмите из него первую группу.

Пример на js:

const input = '+укккк+34343434/edgege';
const pattern = /\+[^+]*\+([^\/]*)\//;
const match = input.match(pattern);
if (match === null) {
  console.log('not matched!');
} else {
  console.log('matched!');
  console.log('value: ' + match[1]);
}

→ Ссылка
Автор решения: Wiktor Stribiżew

Цель задачи не совсем ясна, поэтому я предложу 2 варианта.

1. Поиск цифр сразу после второго знака + в строке

Значит, в строке aaa+bbb+123 поиск должен вернуть 123, а в строке aaa+bbb+ccc+123 совпадения нет.

При таком сценарии используйте ^(?:[^+]*\+){2}(\d+) (демо).

  • ^ - начало строки
  • ^(?:[^+\n]*\+){2} - две последовательности
    • \+ - знака + и
    • [^+]* - ноля и более символов, отличных от знака +
  • (\d+) - Захватывающая подмаска №1: одна и более цифр.

2. Поиск цифр сразу после знака +, следующего после нахождения другого знака +.

Отличие заключается в том, что в строке aaa+bbb+ccc+123 совпадение 123 должно быть найдено. В таком случае, используйте \+[^+]*\+(\d+) (демо).

Реализация на C++ для std::regex

Во-первых, используйте regex_search (regex_match требует совпадения ЦЕЛОЙ строки).
Во-вторых, при объявлении строкой переменной используйте "сырой строковый литерал" (raw string literal), например R"(<ваше_регулярное_выражение>)", чтобы не удваивать обратные слеши.

#include <iostream>
#include <regex>
#include <string>
using namespace std;
 
int main() {
    regex re(R"(^(?:[^+]*\+){2}(\d+))");
    string text("+укккк+34343434/edgege");
    smatch m;
    if (regex_search(text, m, re)) {
        std::cout << m.str(1) << std::endl;
    }
    return 0;
}

См. пример работы кода.

→ Ссылка