【问题标题】:Regex to strip leading zeros正则表达式去除前导零
【发布时间】:2015-11-23 10:25:44
【问题描述】:

我是 C++ 正则表达式的新手

这是我需要的:

X000000043 -> X43

B00030 -> B30

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

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

我想知道正则表达式是否能够在使用正则表达式“in”检查后自动去除给定字符串中的前导零。

还是正则表达式只是一个匹配库,对修改字符串没有帮助? 干杯。

【问题讨论】:

  • 匹配(0+)\d+并用空字符串替换第一个捕获的组
  • 请注意[A-H]X 不匹配。你的要求是什么?看看,does it solve your problem?正则表达式为(^[A-Z])0*([[:d:]]*$)

标签: c++ regex string


【解决方案1】:

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

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

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

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

正则表达式匹配:

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

regex demoIDEONE demo

#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

注意:如果您在较大的文本中包含这些字符串,请将@​​987654338@ 和$ 替换为单词边界\b

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

看到这个IDEONE demo和这个regex demo

【讨论】:

  • 仅供参考:[:digit:][:d:] 的同义词,我在 regex101 中使用扩展版本进行演示。
  • 和 FYI2:如果您需要从 [A-Z] 中的文字进行抽象,您还可以使用 [:upper:] POSIX 字符类来匹配大写字母:std::regex in(R"(\b([[:upper:]])0*([[:d:]]*)\b)");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多