前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则表达式查找替换

正则表达式查找替换

作者头像
立羽
发布2023-08-24 13:30:33
1690
发布2023-08-24 13:30:33
举报
文章被收录于专栏:Unity3d程序开发

1 项目描述

在文本中查找替换对应的字符串,功能如下:

thisisbefore(self ,func) 替换成thisisafter(func,self).

2详细设计

2.1字符串查找替换

代码语言:javascript
复制
string regexReplace(string sMsg, string sSreach, string sReplace)
{
	string sRet = "";
	std::regex rPattern(sSreach);//搜索串
	sRet = std::regex_replace(sMsg, rPattern, sReplace);
	return sRet;
}

2.2self与func交换位置

代码语言:javascript
复制
string regexSelfChangePos(string sMsg)
{
	string sFunc = "";
	string sSelf = "";
	std::smatch rPotRet;
	std::regex rPotPattern("[(](\\s*[a-zA-Z]+[0-9]*[a-zA-Z]+[0-9]*[.]*[a-zA-Z]+[0-9]*[a-zA-Z]+[0-9]*\\s*),(\\s*[a-zA-Z]+[0-9]*[a-zA-Z]+[0-9]*[.]*[a-zA-Z]+[0-9]*[a-zA-Z]+[0-9]*\\s*)[)]");
	const std::sregex_token_iterator end;

	for (std::sregex_token_iterator itPot(sMsg.begin(), sMsg.end(), rPotPattern); itPot != end; ++itPot)
	{
		std::string sPot = *itPot;
		if (std::regex_search(sPot, rPotRet, rPotPattern))
		{
			sFunc = rPotRet[1].str();
			sSelf = rPotRet[2].str();
		}

	}

	sFunc = regexDelBlank(sFunc);
	sSelf = regexDelBlank(sSelf);
	string tmp = sSelf + "Tmp";
	sMsg = regexReplace(sMsg, sFunc, tmp);
	sMsg = regexReplace(sMsg, sSelf, sFunc);
	sMsg = regexReplace(sMsg, sFunc + "Tmp", sSelf);
	return sMsg;
}

2.3文件读写操作

代码语言:javascript
复制
int fileTest()
{
	char* old_locale = _strdup(setlocale(LC_CTYPE, NULL));
	setlocale(LC_CTYPE, "chs");
	CString StrFileName("d:\\fileTest.lua");
	CStdioFile TempFile, File;
	if (!File.Open(StrFileName, CFile::modeRead))
		return -1;
	CString StrTempFileName = File.GetFileTitle() + CString(".tmp");
	if (!TempFile.Open(StrTempFileName, CFile::modeCreate | CFile::modeReadWrite))
		return -1;
	CString Str;
	while (File.ReadString(Str))
	{
		string sMsg = (CStringA)Str;
		sMsg = clickDeal(sMsg);
		CString strNew(sMsg.c_str());	
		TempFile.WriteString(strNew + CString("\n"));		
	}
	File.Close();
	TempFile.Close();
	CFile::Remove(StrFileName);
	CFile::Rename(StrTempFileName, StrFileName);
	printf("successful ");
	setlocale(LC_CTYPE, old_locale); //还原语言区域的设置 
	free(old_locale);//还原区域设定
	return 0;
}

全部源代码

代码语言:javascript
复制
// Regex2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Regex2.h"
#include "stdafx.h"

#include <regex>
#include <iostream>
#include <string>
#include "Windows.h" 
#include "Windef.h" 
#include "atltypes.h"
#include <atlconv.h>
#include <locale.h>
// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一的应用程序对象

using namespace std;
//替换
string regexReplace(string sMsg, string sSreach, string sReplace)
{
	string sRet = "";
	std::regex rPattern(sSreach);//搜索串
	sRet = std::regex_replace(sMsg, rPattern, sReplace);
	return sRet;
}

string regexDelBlank(string sMsg)
{
	string sSreach = "\\s*";

	std::regex rPattern(sSreach);//搜索串

	sMsg = std::regex_replace(sMsg, rPattern, "");

	return sMsg;
}
string regexSelfChangePos(string sMsg)
{
	string sFunc = "";
	string sSelf = "";
	std::smatch rPotRet;//([0-9]+)  ([a-zA-Z]+)
	std::regex rPotPattern("[(](\\s*[a-zA-Z]+[0-9]*[a-zA-Z]+[0-9]*[.]*[a-zA-Z]+[0-9]*[a-zA-Z]+[0-9]*\\s*),(\\s*[a-zA-Z]+[0-9]*[a-zA-Z]+[0-9]*[.]*[a-zA-Z]+[0-9]*[a-zA-Z]+[0-9]*\\s*)[)]");
	const std::sregex_token_iterator end;

	for (std::sregex_token_iterator itPot(sMsg.begin(), sMsg.end(), rPotPattern); itPot != end; ++itPot)
	{
		std::string sPot = *itPot;
		if (std::regex_search(sPot, rPotRet, rPotPattern))
		{
			sFunc = rPotRet[1].str();
			sSelf = rPotRet[2].str();
		}

	}

	sFunc = regexDelBlank(sFunc);
	sSelf = regexDelBlank(sSelf);
	string tmp = sSelf + "Tmp";
	sMsg = regexReplace(sMsg, sFunc, tmp);
	sMsg = regexReplace(sMsg, sSelf, sFunc);
	sMsg = regexReplace(sMsg, sFunc + "Tmp", sSelf);
	return sMsg;
}

string  clickDeal(string sMsg)
{
	string sOut = regexReplace(sMsg, "thisisbefore", "thisisafter");

	sMsg = regexSelfChangePos(sOut);
	return sMsg;
}

int fileTest()
{
	char* old_locale = _strdup(setlocale(LC_CTYPE, NULL));
	setlocale(LC_CTYPE, "chs");
	CString StrFileName("d:\\fileTest.lua");
	CStdioFile TempFile, File;
	if (!File.Open(StrFileName, CFile::modeRead))
		return -1;
	CString StrTempFileName = File.GetFileTitle() + CString(".tmp");
	if (!TempFile.Open(StrTempFileName, CFile::modeCreate | CFile::modeReadWrite))
		return -1;
	CString Str;
	while (File.ReadString(Str))
	{
		string sMsg = (CStringA)Str;
		sMsg = clickDeal(sMsg);
		CString strNew(sMsg.c_str());	
		TempFile.WriteString(strNew + CString("\n"));		
	}
	File.Close();
	TempFile.Close();
	CFile::Remove(StrFileName);
	CFile::Rename(StrTempFileName, StrFileName);
	printf("successful ");
	setlocale(LC_CTYPE, old_locale); //还原语言区域的设置 
	free(old_locale);//还原区域设定
	return 0;
}


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	HMODULE hModule = ::GetModuleHandle(NULL);

	if (hModule != NULL)
	{
		// 初始化 MFC 并在失败时显示错误
		if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
		{
			// TODO:  更改错误代码以符合您的需要
			_tprintf(_T("错误:  MFC 初始化失败\n"));
			nRetCode = 1;
		}
		else
		{
			// TODO:  在此处为应用程序的行为编写代码。
			fileTest();
		}
	}
	else
	{
		// TODO:  更改错误代码以符合您的需要
		_tprintf(_T("错误:  GetModuleHandle 失败\n"));
		nRetCode = 1;
	}
	getchar();
	return nRetCode;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 项目描述
  • 2详细设计
    • 2.2self与func交换位置
      • 2.3文件读写操作
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档