QRegExp в C++ для захвата части строки

Я пытаюсь использовать Qt для выполнения регулярных выражений в моем приложении C++. Я уже делал подобные регулярные выражения с Qt в C++, но это оказывается трудным.

Учитывая строку с необязательным _# в конце строки, я хочу извлечь часть строки до этого.

Примеры:

"blue_dog" should result "blue_dog"
"blue_dog_1" should result "blue_dog"
"blue_dog_23" should result "blue_dog"

Это код, который у меня есть, но он еще не работает:

QString name = "blue_dog_23";
QRegExp rx("(.*?)(_\\d+)?");    
rx.indexIn(name);
QString result = rx.cap(1);  

Я даже попробовал следующие дополнительные опции во многих вариантах без удачи. Мой код выше всегда приводит к "":

rx.setMinimal(TRUE);   
rx.setPatternSyntax(QRegExp::RegExp2);

2 ответа

Решение

Иногда проще не упаковать все в одно регулярное выражение. В вашем случае вы можете ограничить манипулирование случаем существующего _# суффикс. В противном случае результат name:

QString name = "blue_dog_23";
QRegExp rx("^(.*)(_\\d+)$");
QString result = name;
if (rx.indexIn(name) == 0)
    result = rx.cap(1);

Кроме того, вы можете разделить последний бит и проверить, является ли он числом. Компактное (но, возможно, не самое читаемое) решение:

QString name = "blue_dog_23";
int i = name.lastIndexOf('_');
bool isInt = false;
QString result = (i >= 0 && (name.mid(i+1).toInt(&isInt) || isInt)) ? name.left(i) : name;

Следующее решение должно работать так, как вы хотите!

^[^\s](?:(?!_\d*\n).)*/gm

По сути, это означает, что соответствует все до, но не включая, _\d*\n, Вот, _\d*\n значит соответствует _ символ, затем сопоставьте любое количество цифр \d* до новой строки маркера, \n достигнуто ?! является негативным взглядом, и ?: это группа без захвата. По сути, комбинация означает, что последовательность после ?: является группой, представляющей не включающую конечную точку того, что должно быть зафиксировано.

^[^\s] сообщает выражению совпадение, начиная с начала строки, если первый символ не является пробелом.

/gm устанавливает глобальный флаг (позволяющий возвращать более одного совпадения) и флаг многолинейности (который позволяет последовательностям совпадать после одной строки.

Другие вопросы по тегам