正则表达式用模式替换模式
Regular Expression replacing pattern with pattern
我是正则表达式的新手。我在谷歌上搜索,找到了一些解决方案,然后我想出了自己的解决方案,如下
#include <string.h>
#include <regex.h>
#include <iostream>
int rreplace (char *buf, int size, regex_t *re, char *rp){
char *pos;
int sub, so, n;
regmatch_t pmatch [10];
if (regexec (re, buf, 10, pmatch, 0))
return 0;
for (pos = rp; *pos; pos++)
if (*pos == '' && *(pos + 1) > '0' && *(pos + 1) <= '9'){
so = pmatch [*(pos + 1) - 48].rm_so;
n = pmatch [*(pos + 1) - 48].rm_eo - so;
if (so < 0 || strlen (rp) + n - 1 > size)
return 1;
memmove (pos + n, pos + 2, strlen (pos) - 1);
memmove (pos, buf + so, n);
pos = pos + n - 2;
}
sub = pmatch [1].rm_so; /* no repeated replace when sub >= 0 */
for (pos = buf; !regexec (re, pos, 1, pmatch, 0); ){
n = pmatch [0].rm_eo - pmatch [0].rm_so;
pos += pmatch [0].rm_so;
if (strlen (buf) - n + strlen (rp) + 1 > size)
return 1;
memmove (pos + strlen (rp), pos + n, strlen (pos) - n + 1);
memmove (pos, rp, strlen (rp));
pos += strlen (rp);
if (sub >= 0)
break;
}
return 0;
}
int main (int argc, char **argv){
//buf [FILENAME_MAX],
char rp [FILENAME_MAX];
regex_t re;
string toBeReplaced = "-";
string replacedWith = "/";
regcomp (&re, toBeReplaced.c_str(), REG_ICASE);
string buf;
cout << "Enter date separated with dash" << endl;
cin >> buf;
char * replacedWith_ = new char[replacedWith.size() + 1];
std::copy(replacedWith.begin(), replacedWith.end(), replacedWith_);
replacedWith_[replacedWith.size()] = ' '; // don't forget the terminating 0
char * buf_ = new char[buf.size() + 1];
std::copy(buf.begin(), buf.end(), buf_);
buf_[buf.size()] = ' '; // don't forget the terminating 0
rreplace (buf_, FILENAME_MAX, &re, strcpy (rp, replacedWith_));
cout<< buf_ << endl;
regfree (&re);
delete[] replacedWith_;
return 0;
}
如果我的字符串包含类似的内容,这个代码就可以正常工作
22-04-2013
并将其更改为
CCD_ 2。但我希望它像一样通用
dd-dd-dddd
将被取代
dd/dd/dddd
因为我希望它是通用的。我也在linux g++
工作。大多数可用的在线解决方案都在不同的平台上。我还尝试了以下
string toBeReplaced = "d[-]d";
&
string replacedWith = "d/d";
但没有运气。当我输入CCD_ 7时得到CCD_。我不知道为什么。如果我问了一些愚蠢的问题,请原谅我。
编辑
我的问题是匹配一个模式并用一个模式替换它。后面跟连字符的类似数字应该替换为后面跟斜线的数字。
问题
您不能用more正则表达式替换匹配项,您将获得文本d/d
。
解决方案
为了实现您的目标,您需要使用backreferenced捕获组()
进行替换,如下所示:
(d{2})-(d{2})-(d{4})
您的替换字符串如下:
$1/$2/$3
正如您所知,每个捕获组都有编号。在上面的正则表达式中有三个捕获组。
关于捕获组的进一步说明
- 每当在
(regex)
中包装表达式时,都会指定一个带编号的捕获组 - 为了使表达式保持有序,可以指定非捕获组,如以下
(?:regex)
- 为了更容易回引用,创建一个命名的捕获组,如下所示:
(?<name>regex)
- 要引用替换字符串中的命名捕获组,请使用
${name}
,而不是使用$1
请注意,在上述示例中,regex
应替换为所需的正则表达式。
反向引用的某些语法可能因Regex实现的不同而有所不同,例如:1
而不是$1
演示
以下是我所说的的可视化演示
Regex101示例,捕获日期时间字符串上的组
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么在保护模式下继承升级不起作用
- 如何用转义符替换字符串中的所有特殊字符
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 使用可变模板的Broadcaster/Listener模式
- c++方法参数只能在linux的发布模式下自行更改
- 使用宏替换工厂模式样式 API 中的"create()"函数
- Haskell中用多态性替换条件的等效模式是什么?
- QtLineEdit 占位符:如何让用户在插入模式下将字符 1 替换为 1
- 替换decorator模式以强制执行创建顺序
- 正则表达式用模式替换模式
- C++(库)中的Java模式替换
- 替换c++ 98中的模式
- 使用std::regex_replace从替换模式引用整个匹配