Regex doesn't seem to work with Qt
-
Hello guys, I hope you are doing well. I am trying to create a regex in order to filter some text:
Symbols from "/mnt/home/petros/test". Local exec file: `/mnt/home/petros/test', file type elf64-x86-64. Entry point: 0x1050 0x0000000000000318 - 0x0000000000000334 is .interp 0x0000000000000338 - 0x0000000000000368 is .note.gnu.property 0x0000000000000368 - 0x0000000000000388 is .note.ABI-tag 0x0000000000000388 - 0x00000000000003ac is .gnu.hash 0x00000000000003b0 - 0x0000000000000458 is .dynsym 0x0000000000000458 - 0x00000000000004da is .dynstr 0x00000000000004da - 0x00000000000004e8 is .gnu.version 0x00000000000004e8 - 0x0000000000000508 is .gnu.version_r 0x0000000000000508 - 0x00000000000005c8 is .rela.dyn 0x00000000000005c8 - 0x00000000000005e0 is .rela.plt 0x0000000000001000 - 0x0000000000001017 is .init 0x0000000000001020 - 0x0000000000001040 is .plt 0x0000000000001040 - 0x0000000000001048 is .plt.got 0x0000000000001050 - 0x00000000000011d9 is .text 0x00000000000011dc - 0x00000000000011e5 is .fini 0x0000000000002000 - 0x0000000000002017 is .rodata 0x0000000000002018 - 0x0000000000002054 is .eh_frame_hdr 0x0000000000002058 - 0x0000000000002144 is .eh_frame 0x0000000000003db8 - 0x0000000000003dc0 is .init_array 0x0000000000003dc0 - 0x0000000000003dc8 is .fini_array 0x0000000000003dc8 - 0x0000000000003fb8 is .dynamic 0x0000000000003fb8 - 0x0000000000004000 is .got 0x0000000000004000 - 0x0000000000004010 is .data 0x0000000000004010 - 0x0000000000004018 is .bss
This regex here (
/file type.*/g
) filters correctly what I am trying to do. Basically I will delete the "file type " part later and keep only the "elf64-x86-64." but that's ok.When I try to create this regex with Qt though it doesn't seem to work:
QRegExp re{"//file type.*//g"}; // Even without escaping it, it doesn't capture anything. QString str{output}; //This is the wall of text above. qDebug() << re.capturedTexts(); // ("") qDebug() << "exact match? " << re.exactMatch(str); // exact match? false
So my question is does Qt5 have a different syntax for regular expressions or am I missing something else here?
-
@Petross404_Petros-S QRegExp is obsolete, please use QRegularExpression.
-
@artwaw said in Regex doesn't seem to work with Qt:
@Petross404_Petros-S QRegExp is obsolete, please use QRegularExpression.
You are right, but since this a contribution to a project that isn't mine, the developer needs the the minimum Qt version to be Qt5.4
Am I on the safe side?
-
@Petross404_Petros-S In the documentation to QRegularExpression class documentation there is clearly written
This class was introduced in Qt 5.0.
-
@Petross404_Petros-S said in Regex doesn't seem to work with Qt:
QRegExp re{"//file type.*//g"}; // Even without escaping it, it doesn't capture anything.
Given you're using
QRegExp
(wouldn't make any difference ifQRegularExpression
anyway). Where did you get the idea this is suitable input for it? It is not.So my question is does Qt5 have a different syntax for regular expressions or am I missing something else here?
This regex here
(/file type.*/g)
You seem to be assuming that what you see on that page you reference is literally what you can use elsewhere. Though even then you have changed it. And you seem to have selected for JavaScript.
-
@JonB said in Regex doesn't seem to work with Qt:
@Petross404_Petros-S said in Regex doesn't seem to work with Qt:
QRegExp re{"//file type.*//g"}; // Even without escaping it, it doesn't capture anything.
Given you're using
QRegExp
(wouldn't make any difference ifQRegularExpression
anyway). Where did you get the idea this is suitable input for it? It is not.So my question is does Qt5 have a different syntax for regular expressions or am I missing something else here?
This regex here
(/file type.*/g)
You seem to be assuming that what you see on that page you reference is literally what you can use elsewhere. Though even then you have changed it. And you seem to have selected for JavaScript.
Oh sorry then, how could I miss this?
-
the
/g
is not how you set the regex to globalconst QRegularExpression regExp(QStringLiteral(R"***(file type.*)***")); QRegularExpressionMatchIterator regExpMatch = regExp.globalMatch(input); while (regExpMatch .hasNext()) { const QRegularExpressionMatch match = regExpMatch .next(); qDebug() << match.capturedRef(0); }
-
Hi,
Are you trying to use file glob pattern ?
-
@VRonin said in Regex doesn't seem to work with Qt:
the
/g
is not how you set the regex to globalconst QRegularExpression regExp(QStringLiteral(R"***(file type.*)***")); QRegularExpressionMatchIterator regExpMatch = regExp.globalMatch(input); while (regExpMatch .hasNext()) { const QRegularExpressionMatch match = regExpMatch .next(); qDebug() << match.capturedRef(0); }
Yes, it seems that it needed a different approach. This works:
QString str{output}; //The output from the first post. const QRegularExpression regExp(QStringLiteral(R"***(file type.*)***")); QRegularExpressionMatch regExpMatch = regExp.match(str); QString strFileType {regExpMatch.captured(0)}; //"file type elf64-x86-64." if(strFileType.contains("file type") && strFileType.contains(".")) { strFileType.replace("file type ", ""); strFileType.replace(".", ""); } That was a little qDebug() << strFileType; // "elf64-x86-64"
Thank you all.
-
@SGaist said in Regex doesn't seem to work with Qt:
Hi,
Are you trying to use file glob pattern ?
Yes but in the wrong way. Thank you for your interest.
-
@Petross404_Petros-S said in Regex doesn't seem to work with Qt:
strFileType.contains(".")
.
in regexp has a special menaing. if you want to match the literal dot you have to escape it -
@VRonin said in Regex doesn't seem to work with Qt:
@Petross404_Petros-S said in Regex doesn't seem to work with Qt:
strFileType.contains(".")
.
in regexp has a special menaing. if you want to match the literal dot you have to escape itInteresting because it actually removed the dot. When I used it like " \. " it didn't work.
EDIT It doesn't show the \ characters I used above. -
My bad, I wasn't clear.
.
in QRegularExpression mean any character.strFileType.replace(".", "");
is correct but unnecessary:QString str{output}; //The output from the first post. const QRegularExpression regExp(QStringLiteral(R"***(file type\s*(.*)\.)***")); QRegularExpressionMatch regExpMatch = regExp.match(str); qDebug() << regExpMatch.captured(0); //"file type elf64-x86-64." QString strFileType = regExpMatch.captured(1); qDebug() << strFileType; //"elf64-x86-64"
-
QRegularExpression::wildcardToRegularExpression is what you were looking for.
-
@SGaist said in Regex doesn't seem to work with Qt:
QRegularExpression::wildcardToRegularExpression is what you were looking for.
I am afraid I can't use this function since it is very recent and compatiblity with Qt5.4 is needed. But thank you.
@VRonin thank you too, your example was to the point. I will take a deeper look at what you did there. Thanks again.