【发布时间】:2017-07-21 14:10:45
【问题描述】:
我有以下代码:
#include <iostream>
#include <regex>
using namespace std;
int main()
{
string s;
s = "server ('m1.labs.terad ata.com') username ('us er5') password('user)5') dbname ('def\\ault')";
regex re("(\'(.*?)\'\)");
sregex_token_iterator i(s.begin(), s.end(), re, 1);
sregex_token_iterator j;
unsigned count = 0;
while(i != j)
{
cout <<*i<< endl;
count++;
i++;
}
cout << "There were " << count << " tokens found." << endl;
return 0;
}
上面的正则表达式用于提取单引号之间的所有内容。
但是我怎样才能使正则表达式能够提取转义的单引号(例如用户名(user''5)应该被提取为'user'5'。
提前致谢。我真的需要帮助。试了这么多天。
例子
'm1.labs.terad ata.com'
'us er5'
'user)5'
'def\ault'
找到了 4 个令牌。请注意,字符串周围的单引号应该在那里。提前感谢您的帮助。
但是现在如果我的字符串是
s = "server ('m1.labs.terad ata.com') username ('us ''er5') password('user)5') dbname ('def\\ault')";
输出应该是:
'm1.labs.terad ata.com'
'us 'er5' <<<<<<<<<<<<<<<<<<<
'user)5'
'def\ault'
【问题讨论】:
-
这可能不是最好的正则表达式匹配,正则表达式只能匹配那里的内容,所以一旦你开始进入更改字符串值的领域,你就超出了范围匹配模式。您可能希望使用某种替换正则表达式,例如 replace(\\\\, \\),但我对
c++不够熟悉,无法帮助您。 -
请试试这个
regex re("(\\'.*?[^\\\\]\\')");。另外,请注意,您需要转义 c++ 字符串中的反斜杠。 -
@ikleschenkov 如果我不清楚,我很抱歉。但我想通过添加两个双引号来转义单引号。即'user''6'应该是'user'6'
-
@hydra123 您能否编辑您的问题以显示,输入行应该是什么(我没有在其中看到
'user''6')以及您想要得到什么结果?是否要提取单引号之间的所有字符串并将双单引号转换为单单引号? -
( <-- Unbalanced '(' \' ( .*? ) \'\)解析 C++ 双引号字符串只会在转义时移除转义。你的正则表达式不应该编译。