用C ++中的QRegExp来捕获字符串的一部分

时间:2017-08-08 22:58:24

标签: c++ regex qt qregexp

我正在尝试使用Qt在我的C ++应用程序中执行正则表达式。 我以前在C ++中用Qt做了类似的正则表达式,但这个表现很难。

给定一个字符串末尾带有可选_#的字符串,我想在此之前提取字符串的一部分。

示例:

"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 个答案:

答案 0 :(得分:1)

有时候更容易不将所有内容打包在一个正则表达式中。在您的情况下,您可以将操作限制为现有_#后缀的大小写。否则结果为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;

答案 1 :(得分:0)

以下解决方案应该按照您的意愿运行!

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

基本上,这就是说匹配所有内容,但不包括_\d*\n。在这里,_\d*\n表示匹配_字符,然后匹配任意数量的数字\d*,直到达到新的行标记\n?!是否定前瞻,?:是非捕获组。基本上,组合意味着?:之后的序列是表示应该捕获的内容的非包含端点的组。

只要第一个字符不是空格,^[^\s]就会告诉表达式从一行的开头开始匹配。

/gm设置全局标志(允许返回多个匹配)和mutli-line标志(允许序列匹配超过一行。