正则表达式使用提升令牌迭代器提取单引号和括号之间的值

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/…

以上是关于正则表达式使用提升令牌迭代器提取单引号和括号之间的值的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式多引号选择

Python正则表达式怎么区配引号之间的内容

正则表达式用逗号分隔 - 不在括号或单引号内

如何使用正则表达式或任何其他方法在 PL/SQL 中提取单引号内的字符串 [重复]

怎样在scala正则表达式提取器中使用小括号

正则表达式返回两个引号之间的字符串“?