Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex RE2嵌套正则表达式组匹配_Regex - Fatal编程技术网

Regex RE2嵌套正则表达式组匹配

Regex RE2嵌套正则表达式组匹配,regex,Regex,有一个RE2正则表达式,如下所示 const re2::RE2 numRegex("(([0-9]+),)+([0-9])+"); std::string inputStr; inputStr="apple with make,up things $312,412,3.00"); RE2::Replace(&inputStr, numRegex, "$1$3"); cout<<inputStr;

有一个RE2正则表达式,如下所示

  const re2::RE2 numRegex("(([0-9]+),)+([0-9])+");
  std::string inputStr;
  inputStr="apple with make,up things $312,412,3.00");
  RE2::Replace(&inputStr, numRegex, "$1$3");
  cout<<inputStr;
const re2::re2 numRegex(([0-9]+),)+([0-9])+);
std::字符串inputStr;
inputStr=“苹果公司,制造物品$312412,3.00”);
RE2::替换(&inputStr,numRegex,“$1$3”);

cout基于RE2的解决方案

由于RE2不支持lookarounds,因此没有纯单通道正则表达式解决方案

您可以有一个解决方法(通常在没有可用解决方案时):用
(\d)、(\d)
regex和
$1$2
替换字符串两次:

const re2::re2 numRegex(R“(\d),(\d))”;
std::string inputStr(“苹果加化妆品,化妆品$312412,3.00”);
RE2::替换(&inputStr,numRegex,“$1$2”);

RE2::替换(&inputStr,numRegex,“$1$2”);// 基于RE2的解决方案

由于RE2不支持lookarounds,因此没有纯单通道正则表达式解决方案

您可以有一个解决方法(通常在没有可用解决方案时):用
(\d)、(\d)
regex和
$1$2
替换字符串两次:

const re2::re2 numRegex(R“(\d),(\d))”;
std::string inputStr(“苹果加化妆品,化妆品$312412,3.00”);
RE2::替换(&inputStr,numRegex,“$1$2”);

RE2::替换(&inputStr,numRegex,“$1$2”);// 在您尝试的模式中,您正在重复外部组
([0-9]+),)+
,该组将包含上一次迭代的值,该值可以匹配1+位和逗号

最后一次迭代将捕获
412、
312,
将只匹配


您使用的是
regex
,但是如果您有可用的boost,您可以使用
\G
锚定,它可以获得在上一次匹配结束时声明位置的迭代匹配,并替换为空字符串

(?:\$|\G(?!^))\d+\K,(?=\d)
模式匹配:

  • (?:
    非捕获组
    • \$
      匹配
      $
    • |
    • \G(?!^)
      在上一个匹配的末尾而不是开始处断言位置
  • 关闭非捕获组
  • \d+\K
    匹配1+个数字,然后忘记目前匹配的内容
  • ,(?=\d)
    匹配一个逗号并直接在右边断言一个数字


在您尝试的模式中,您正在重复外部组
([0-9]+),)+
,该组将包含上一次迭代的值,该值可以匹配1+位和逗号

最后一次迭代将捕获
412、
312,
将只匹配


您使用的是
regex
,但是如果您有可用的boost,您可以使用
\G
锚定,它可以获得在上一次匹配结束时声明位置的迭代匹配,并替换为空字符串

(?:\$|\G(?!^))\d+\K,(?=\d)
模式匹配:

  • (?:
    非捕获组
    • \$
      匹配
      $
    • |
    • \G(?!^)
      在上一个匹配的末尾而不是开始处断言位置
  • 关闭非捕获组
  • \d+\K
    匹配1+个数字,然后忘记目前匹配的内容
  • ,(?=\d)
    匹配一个逗号并直接在右边断言一个数字


对不起,我不太清楚你想要实现什么。您只是想从数字中删除逗号?我将匹配基于逗号的数字格式,然后进行第二次传递以删除数字。您正在重复一个捕获组,该捕获组将具有迭代的最后一个值。您只想删除数字之间的逗号。使用
std::regex numRegex(R“(\d),(?=\d))”
和替换为
$1
regex_replace(inputStr,numRegex,“$1”)
。对不起,我不太清楚您想要实现什么。您只是想从数字中删除逗号?我将匹配基于逗号的数字格式,然后进行第二次传递以删除数字。您正在重复一个捕获组,该捕获组将具有迭代的最后一个值。您只想删除数字之间的逗号。使用
std::regex numRegex(R“(\d),(?=\d))”和替换为
$1
regex_替换(inputStr,numRegex,“$1”)
。感谢nit解决方案。由于我们需要使用RE2,它不支持前瞻。我为RE2添加了一个解决方案。感谢nit解决方案。由于我们需要使用RE2,它不支持前瞻。我为RE2添加了一个变通方法。
apple with make,up things $3124123.00