Регулярное выражение для последовательности цифр после второго попавшегося символа + (плюс)
Подскажите, пожалуйста, как составить регулярное выражение для поиска последовательности цифр начиная со второго попавшегося символа "+" до последующего за ним слеша (не включая их).
Например, +укккк+34343434/edgege должно вернуть 34343434.
\+([\s\S]+?)\/ - такая конструкция возвращает все от первого плюса до слеша.
Поскольку после второго попавшегося плюса у меня всегда идут числа, то сработало \+([0-9]+?)\/.
Ответы (3 шт):
(?<=\+[^+]*\+)[^/]+
Наглядный пример: https://regex101.com/r/sDPKvb/1
Работать будет не везде из-за ретроспективной проверки (?<=…).
Если это важно, можно использовать следующую регулярку:
(?:\+[^+]*){1}\+([^\/]+)
Но тогда надо будет использовать функции замены.
Наглядный пример тут: https://regex101.com/r/lRODjI/1
Используйте выражение \+[^+]*\+([^\/]*)\/, в случае совпадения возьмите из него первую группу.
Пример на 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]);
}
Цель задачи не совсем ясна, поэтому я предложу 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;
}
См. пример работы кода.