首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

请问怎么用正则表达式实现字符串的替换

2012-01-29 
请教如何用正则表达式实现字符串的替换我正在作字符串的查找和替换,有三个个问题请教一下:1.带通配符的字

请教如何用正则表达式实现字符串的替换
我正在作字符串的查找和替换,有三个个问题请教一下:
1.带通配符的字符串替换有没有例子可以参考?
2.用正则表达式如何实现字符串的替换
3.我想要的效果就是vc的查找界面中的通配符和正则表达式的效果,有类似源码么?
CAtlRegExp类是不是不行?
谢谢。

[解决办法]
来个例子:
待替换字符串:123a456
正则式:(\d+)a(\d+)
替换式:$2a$1

运行结果:123和456对调
[解决办法]
boost的regex的例子


/*
*
* Copyright (c) 1998-2002
* John Maddock
*
* Use, modification and distribution are subject to the
* Boost Software License, Version 1.0. (See accompanying file
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*
*/

/*
* LOCATION: see http://www.boost.org for most recent version.
* FILE regex_replace_example.cpp
* VERSION see <boost/version.hpp>
* DESCRIPTION: regex_replace example:
* converts a C++ file to syntax highlighted HTML.
*/

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <iterator>
#include <boost/regex.hpp>
#include <fstream>
#include <iostream>

// purpose:
// takes the contents of a file and transform to
// syntax highlighted code in html format

boost::regex e1, e2;
extern const char* expression_text;
extern const char* format_string;
extern const char* pre_expression;
extern const char* pre_format;
extern const char* header_text;
extern const char* footer_text;

void load_file(std::string& s, std::istream& is)
{
s.erase();
if(is.bad()) return;
s.reserve(is.rdbuf()-> in_avail());
char c;
while(is.get(c))
{
if(s.capacity() == s.size())
s.reserve(s.capacity() * 3);
s.append(1, c);
}
}

int main(int argc, const char** argv)
{
try{
e1.assign(expression_text);
e2.assign(pre_expression);
for(int i = 1; i < argc; ++i)
{
std::cout < < "Processing file " < < argv[i] < < std::endl;
std::ifstream fs(argv[i]);
std::string in;
load_file(in, fs);
fs.close();
std::string out_name = std::string(argv[i]) + std::string( ".htm ");
std::ofstream os(out_name.c_str());
os < < header_text;
// strip ' < ' and '> ' first by outputting to a
// temporary string stream
std::ostringstream t(std::ios::out | std::ios::binary);
std::ostream_iterator <char> oi(t);
boost::regex_replace(oi, in.begin(), in.end(), e2, pre_format, boost::match_default | boost::format_all);
// then output to final output stream
// adding syntax highlighting:
std::string s(t.str());
std::ostream_iterator <char> out(os);
boost::regex_replace(out, s.begin(), s.end(), e1, format_string, boost::match_default | boost::format_all);
os < < footer_text;
os.close();
}
}
catch(...)
{ return -1; }
return 0;
}

extern const char* pre_expression = "( <)|(> )|(&)|\\r ";
extern const char* pre_format = "(?1&lt;)(?2&gt;)(?3&amp;) ";


const char* expression_text = // preprocessor directives: index 1
"(^[[:blank:]]*#(?:[^\\\\\\n]|\\\\[^\\n[:punct:][:word:]]*[\\n[:punct:][:word:]])*)| "


// comment: index 2
"(//[^\\n]*|/\\*.*?\\*/)| "
// literals: index 3
"\\ <([+-]?(?:(?:0x[[:xdigit:]]+)|(?:(?:[[:digit:]]*\\.)?[[:digit:]]+(?:[eE][+-]?[[:digit:]]+)?))u?(?:(?:int(?:8|16|32|64))|L)?)\\> | "
// string literals: index 4
"( '(?:[^\\\\ ']|\\\\.)* '|\ "(?:[^\\\\\ "]|\\\\.)*\ ")| "
// keywords: index 5
"\\ <(__asm|__cdecl|__declspec|__export|__far16|__fastcall|__fortran|__import "
"|__pascal|__rtti|__stdcall|_asm|_cdecl|__except|_export|_far16|_fastcall "
"|__finally|_fortran|_import|_pascal|_stdcall|__thread|__try|asm|auto|bool "
"|break|case|catch|cdecl|char|class|const|const_cast|continue|default|delete "
"|do|double|dynamic_cast|else|enum|explicit|extern|false|float|for|friend|goto "
"|if|inline|int|long|mutable|namespace|new|operator|pascal|private|protected "
"|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_cast "
"|struct|switch|template|this|throw|true|try|typedef|typeid|typename|union|unsigned "
"|using|virtual|void|volatile|wchar_t|while)\\> "
;

const char* format_string = "(?1 <font color=\ "#008040\ "> $& </font> ) "
"(?2 <I> <font color=\ "#000080\ "> $& </font> </I> ) "
"(?3 <font color=\ "#0000A0\ "> $& </font> ) "
"(?4 <font color=\ "#0000FF\ "> $& </font> ) "
"(?5 <B> $& </B> ) ";

const char* header_text = " <HTML> \n <HEAD> \n "
" <TITLE> Auto-generated html formated source </TITLE> \n "
" <META HTTP-EQUIV=\ "Content-Type\ " CONTENT=\ "text/html; charset=windows-1252\ "> \n "
" </HEAD> \n "
" <BODY LINK=\ "#0000ff\ " VLINK=\ "#800080\ " BGCOLOR=\ "#ffffff\ "> \n "
" <P> </P> \n <PRE> ";

const char* footer_text = " </PRE> \n </BODY> \n\n ";


[解决办法]
boost倒是有正则库,但是混在一起总是感觉不爽

热点排行