【问题标题】:Writing a Regex pattern c++编写正则表达式模式 C++
【发布时间】:2020-03-26 17:52:31
【问题描述】:

我需要帮助来完成这个正则表达式模式。

这是完整的字符串:

INSERT((1574,"Greene County, Missouri",mo,50,29,77,05000US29077,285449),geography)

这是我尝试使用 regex_search 搜索的字符串部分:

(1574,"Greene County, Missouri",mo,50,29,77,05000US29077,285449)

这是我的正则表达式模式和代码:

regex pattern2("\\(|[0-9]|[a-z]|[A-Z]|\,|\"|");
regex_search (substring,matcher,pattern2);
   for(auto x:matcher)
   {
     substring1 = matcher.suffix().str();
     cout << substring1 << endl;
   }

子字符串将输出:

1574,"Greene County, Missouri",mo,50,29,77,05000US29077,285449),geography)

所以不是我需要的。不胜感激。

【问题讨论】:

  • 没有转义序列\,,可能你想要\\,。我建议使用原始字符串文字:regex pattern2(R"(\(|[0-9]|[a-z]|[A-Z]|\,|"|)");

标签: c++ regex string


【解决方案1】:

要匹配(1574,"Greene County, Missouri",mo,50,29,77,05000US29077,285449),您可以使用capturing groupnegated character class

[^*()\r\n]+\((\([^()\r\n]+\))[^()\r\n]+\)

部分

  • [^*()\r\n]+ 匹配除所列字符以外的任何字符 1 次以上
  • \(匹配第一个左括号
  • ( 捕获第 1 组
    • \( 匹配第二个左括号
      • [^()\r\n]+ 匹配除所列字符以外的任何字符 1 次以上
    • \)关闭第二个左括号
  • )关闭第一组
  • [^()\r\n]+
  • \)关闭第一个左括号

Regex demo

您还可以通过使用重复的非捕获组并使用您打算使用的字符类中允许的字符来使模式更加受限:

[a-zA-Z0-9]+\(\(((?:[a-zA-Z0-9]+|"[a-zA-Z0-9]+(?:,? [a-zA-Z0-9]+)+")(?:,(?:[a-zA-Z0-9]+|"[a-zA-Z0-9]+(?:,? [a-zA-Z0-9]+)+"))+)\),[a-zA-Z0-9]+\)

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多