gpt4 book ai didi

c++ - 使用正则表达式提取带引号和不带引号的值

转载 作者:行者123 更新时间:2023-11-28 07:48:15 25 4
gpt4 key购买 nike

我正在尝试解析 <tag>=<value> 类型的字符串使用正则表达式,但在添加对引用值的支持时遇到了一些问题。这个想法是任何未引用的值都应该从前导/尾随空格中删除,以便 [ Hello ]变成 [Hello] (请忽略方括号。)

但是,当引用该值时,我希望删除包括双引号在内的任何内容,但不再删除,所以 [ " Hello World " ]会变成[" Hello World "]

到目前为止,我已经提出了以下带有模式匹配的代码(请注意,某些字符已被转义或双重转义以避免它们被解释为三字母或其他 C 格式字符。)

void getTagVal( const std::string& tagVal )
{
boost::smatch what;
static const boost::regex pp("^\\s*([a-zA-Z0-9_-]+)\\s*=\\s*\"\?\?([%:\\a-zA-Z0-9 /\\._]+?)\"\?\?\\s*$");

if ( boost::regex_match( tagVal, what, pp ) )
{
const string tag = static_cast<const string&>( what[1] );
const string val = static_cast<const string&>( what[2] );

cout << "Tag = [" << tag << "] Val = [" << val << "]" << endl;
}
}

int main( int argc, char* argv[] )
{
getTagVal("Qs1= \" Hello World \" ");
getTagVal("Qs2=\" Hello World \" ");
getTagVal("Qs3= \" Hello World \"");
getTagVal("Qs4=\" Hello World \"");
getTagVal("Qs5=\"Hello World \"");
getTagVal("Qs6=\" Hello World\"");
getTagVal("Qs7=\"Hello World\"");

return 0;
}

去掉双重转义,分解为:

  • ^ - 行首。
  • \s* - 可选数量的空格。
  • ([a-zA-Z0-9_-]+) - 一个或多个字母数字或破折号或下划线。这被捕获为标签。
  • \s* - 可选数量的空格。
  • = - 一个“相等”的符号。
  • \s* - 可选数量的空格。
  • "?? - 一个可选的双引号(非贪婪)。
  • ([%:\a-zA-Z0-9 /\._]+?) - 一个或多个字母数字或空格、下划线、百分比、冒号、句点、正斜杠或反斜杠。这被捕获为值(非贪婪)。
  • "?? - 一个可选的双引号(非贪婪)。
  • \s* - 可选数量的空格。
  • $ - 行尾

对于 main() 中的示例调用,我希望得到:

Tag = [Qs1] Val = [ Hello World ]
Tag = [Qs2] Val = [ Hello World ]
Tag = [Qs3] Val = [ Hello World ]
Tag = [Qs4] Val = [ Hello World ]
Tag = [Qs5] Val = [Hello World ]
Tag = [Qs6] Val = [ Hello World]
Tag = [Qs7] Val = [Hello World]

但我实际得到的是:

Tag = [Qs1] Val = [" Hello World ]
Tag = [Qs2] Val = [" Hello World ]
Tag = [Qs3] Val = [" Hello World ]
Tag = [Qs4] Val = [" Hello World ]
Tag = [Qs5] Val = ["Hello World ]
Tag = [Qs6] Val = [" Hello World]
Tag = [Qs7] Val = ["Hello World]

所以它几乎是正确的,但由于某种原因,第一个引号在输出值中徘徊,即使我特别将正则表达式的值部分与它外面的引号括起来。

最佳答案

我会将以第一个引号开头的部分更改为替代部分:

"([^"]+)"|([%:\a-zA-Z0-9 /\._]+)\s*

然后,您将不得不处理在正则表达式周围的主机代码中以第二个或第三个捕获括号对结束的引用或未引用文本的两种可能性。

关于c++ - 使用正则表达式提取带引号和不带引号的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14404569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com