正则表达式使用提升令牌迭代器提取单引号和括号之间的值
Posted
技术标签:
【中文标题】正则表达式使用提升令牌迭代器提取单引号和括号之间的值【英文标题】:Regex to extract value between a single quote and parenthesis using boost token iterator 【发布时间】:2017-07-19 13:37:41 【问题描述】:我有这样的价值:
假设我有一个字符串:
s = "server ('m1.labs.teradata.com') username ('u\'se)r_*5') password('uer 5') dbname ('default')";
我需要解压
token1:'m1.labs.teradata.com'
令牌2:'u\'se)r_*5'
令牌3:'uer 5'
我在 cpp 中使用以下正则表达式:
regex re("(\'[!-~]+\')");
sregex_token_iterator i(s.begin(), s.end(), re, 0);
sregex_token_iterator j;
unsigned count = 0;
while(i != j)
cout << "the token is"<<" "<<*i++<< endl;
count++;
cout << "There were " << count << " tokens found." << endl;
return 0;
【问题讨论】:
最简单的就是'[^']+'
您需要捕获该部分,并使用str(1)
获取捕获组#1 的值。
@Slava:我有这样的值:arg1('FooBar') arg2('Another Value') 其他什么正则表达式将返回引号中的值(例如 FooBar 和 Another Value )?我在 cpp 中使用以下正则表达式: regex re("(\'[^']+\')") Like this??
假设我有一个字符串:s = "server ('m1.labs.teradata.com') username ('u\'se)r_*5') password('uer 5') dbname ('默认')”;我需要提取 token1 : 'm1.labs.teradata.com' token2 : 'u\'se)r_*5' token3 : 'uer 5'
你必须使用sregex_token_iterator
而不是普通的吗?
【参考方案1】:
如果您不希望字符串中有符号 '
,那么 '[^']+'
将匹配您的需要:
regex re("'[^']+'");
live example 结果:
the token is 'FooBar'
the token is 'Another Value'
There were 2 tokens found.
如果您不需要单引号作为匹配更改代码的一部分:
regex re("'([^']+)'");
sregex_token_iterator i(s.begin(), s.end(), re, 1);
another live example
the token is FooBar
the token is Another Value
There were 2 tokens found.
【讨论】:
OP already mentioned the string may contain escaped single quotes. @WiktorStribiżew 在哪里? @WiktorStribiżew 评论不是问题的一部分,OP 需要解决问题。目前这个答案是正确的。 我不明白OP现在需要什么。【参考方案2】:这个字符串的正确正则表达式是
(?:'(.+?)(?<!\\)')
https://regex101.com/r/IpzB80/1
【讨论】:
输出字符串应该包含转义的单引号,但是你给的正则表达式不起作用。 试试这个字符串:它不起作用:服务器('m1.labs.teradata.com')用户名('u\'se)r_*5')密码('ue/'r5' ) dbname ('默认') @Pradeep C++11 正则表达式不支持向后看 - ***.com/questions/14538687/…以上是关于正则表达式使用提升令牌迭代器提取单引号和括号之间的值的主要内容,如果未能解决你的问题,请参考以下文章