Regex去掉前导零

Regex to strip leading zeros

本文关键字:Regex      更新时间:2023-10-16

我是C++中Regex的新手

这是我需要的:

0002000043->X43

B00030->B30

我正在使用这个正则表达式

std::regex in("[A-H][[:d:]]");

我想知道regex是否能够在使用regex"in"检查后自动从给定的字符串中去掉前导零。

或者Regex只是一个匹配的库,对修改字符串没有帮助?干杯

std::regex也有一个regex_replace方法。它可以根据给定的模式和替换模式修改字符串。

在您的情况下,您可以使用backreferences捕获的子字符串(这些子字符串在捕捉组的帮助下匹配和捕获,即包含在未加括号中的子模式)。

因此,在您的情况下,您可以使用以下正则表达式:

^([A-Z])0*([[:digit:]]*)$

正则表达式匹配:

  • ^-字符串的开头
  • ([A-Z])-任何大写ASCII字母(被捕获到组1中,我们可以在替换模式中用$1引用它)
  • 0*-0个或多个零
  • ([[:d:]]*)-匹配0个或多个任意数字,并将它们放入捕获组2(替换模式中的$2
  • $—字符串结束

请参阅regex演示和IDEONE演示:

#include <iostream>
#include <regex>
using namespace std;
int main() {
    std::vector<std::string> strings;
    strings.push_back("X000000043");
    strings.push_back("B00030");
    std::regex in("^([A-Z])0*([[:d:]]*)$");
    for (size_t k = 0; k < strings.size(); k++)
    {
        std::cout << "Next string: " << strings[k] << std::endl;
        std::cout << "Replace result: " 
                     << std::regex_replace(strings[k], in, "$1$2") << std::endl;
    }
    return 0;
}

输出:

Next string: X000000043
Replace result: X43
Next string: B00030
Replace result: B30

注意:如果这些字符串位于较大的文本中,请将^$替换为单词边界b:

std::regex in(R"(b([A-Z])0*([[:digit:]]*)b)");

请参阅此IDEONE演示和此regex演示