C++正则表达式例子
给了策划配置公式的地方,需要将策划配置的公式文本转化为可执行的脚本代码:
比如:self->mHp*2+target->2mMp*GetHit()+ self_mon->4mDan/1000 ==> self:lf_mHp(0)*2+dst:lf_mMp(2)*GetHit()+ src:lf_mDan(4)/1000
意思就是
1 指针变量凡是含有self的都变为src,target的都替换为dst
2 调用的属性前面的系数要提取出来
3 属性可能是多种多样的,所以提取方法不能写死。
当时时间紧急,对正则表达式也不熟,按照字符串分割的方法实现了。
代码如下:
void TestFormula(std::string& for_text)
{
using std::string;
using std::vector;
string::size_type pos = ;
string searchStr = "->";
string replaceStr = "#"; if (for_text.find(searchStr) == string::npos)
{
return;
} while ( (pos = for_text.find(searchStr, pos)) != string::npos)
{
if ((for_text.size() >= pos + && for_text[pos + ] == 'm') || (for_text.size() >= pos + && for_text[pos + ] == 'm' && for_text[pos + ] >= '' && for_text[pos + ] <= ''))
{
for_text.replace(pos, searchStr.size(), replaceStr);
}
pos++;
} vector<string> lVector;
vector<string> rVector;
int lastSplitIdx = ;
string lastText("");
for (string::size_type i = ; i < for_text.size(); i++)
{
if (for_text[i] == '+' || for_text[i] == '-' || for_text[i] == '*' || for_text[i] == '/'
|| for_text[i] == '#' || for_text[i] == '(' || for_text[i] == ')' || for_text[i] == ',')
{
if (for_text[i] == '#')
{
lastText = for_text.substr(lastSplitIdx, i - lastSplitIdx);
}
else
{
if (lastText.size() > )
{
lVector.push_back(lastText);
rVector.push_back(for_text.substr(lastSplitIdx, i - lastSplitIdx));
}
lastText = "";
}
lastSplitIdx = i + ;
}
}
if (lastSplitIdx != for_text.size())
{
if (lastText.size() > )
{
lVector.push_back(lastText);
rVector.push_back(for_text.substr(lastSplitIdx, lastText.size() - lastSplitIdx));
}
} if (lVector.size() == || rVector.size() == || lVector.size() != rVector.size())
{
return;
} pos = ;
int parseIdx = ;
while ( ( pos = for_text.find(replaceStr, pos)) != string::npos)
{
string leftStr = lVector.at(parseIdx);
string rightStr = rVector.at(parseIdx);
string oldStr = leftStr + replaceStr + rightStr;
string category = rightStr.substr(, );
string ower = leftStr;
if (category == "" || category == "" || category == "" || category == "" || category == "")
{
rightStr = rightStr.substr(, rightStr.size());
}
else
{
category = "";
}
if (leftStr.find("self", ) != string::npos)
{
ower = "src";
}
else if (leftStr.find("target", ) != string::npos)
{
ower = "dst";
}
string newStr = ower + ":lf_" + rightStr + "(" + category + ")";
for_text.replace(pos - leftStr.size(), oldStr.size(), newStr);
parseIdx++;
pos++;
}
}
int main()
{
std::string text("self->mHp*2+target->2mMp*GetHit()+self_mon->4mDan/1000");
std::cout << text.c_str() << std::endl;
TestFormula(text);
std::cout<<text.c_str()<<std::endl; return ;
}
运行结果:
颇费周折有木有~~~,还有很多临界状态需要检查,一不留神可能就踩到坑里了。
索性,看了看正则表达式,发现非常好用。代码少很多,结果一模一样。
void TestFormulaRegex(std::string& for_text)
{
using std::string;
std::regex pat("([A-Za-z_]+)->([0-4]*)(m[A-Za-z]+)");
string::const_iterator startPos = for_text.begin();
string::const_iterator endPos = for_text.end();
std::smatch mat;
while (std::regex_search(startPos, endPos, mat, pat))
{
string object(mat[].first, mat[].second);
string category(mat[].first, mat[].second);
string attrName(mat[].first, mat[].second);
if (category.compare("") == )
{
category = "";
}
if (object.find("self", ) != string::npos)
{
object = "src";
}
else if (object.find("target", ) != string::npos)
{
object = "dst";
}
string replaceStr(object + ":lf_" + attrName + "(" + category + ")");
for_text.replace(mat[].first, mat[].second, replaceStr);
startPos = for_text.begin();
endPos = for_text.end();
}
}
C++正则表达式例子的更多相关文章
- Perl正则表达式例子
Perl正则表达式 一.介绍 正则表达式各语言都有自己的规范,但是基本都差不多,都是由元字符的组合来进行匹配:由于Nmap内嵌的服务与版本探测是使用的Perl正则规范,因此此篇博客记录一下Perl正则 ...
- EmEditor正则表达式例子
正则表达式中 单词指的是由字母.数字.下划线组合而成的字符串,用符号表示为\w(小写). 空白符包括单字节空格.双字节空格.制表符,用符号表示为\s(小写). 1.匹配被双引号包含的所有字符串(str ...
- python正则表达式例子说明
pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.* ...
- 关于Logstash中grok插件的正则表达式例子
一.前言 近期需要对Nginx产生的日志进行采集,问了下度娘,业内最著名的解决方案非ELK(Elasticsearch, Logstash, Kibana)莫属. Logstash负责采集日志,Ela ...
- 一个 Java 正则表达式例子
今天在项目里看到用 Python 正则表达式的时候,用到 group,没有仔细看.正好学习 Java 正则表达式,对 group 多留意了一下. 上代码: import java.util.regex ...
- java 正则表达式例子, 查找字符串
import java.util.regex.Matcher;import java.util.regex.Pattern; public class Main { public static voi ...
- pyqt 正则表达式例子学习
def rex01(self): username=QtCore.QRegExp('[a-zA-Z0-9_]{2,10}') self.names.setValidator(QtGui.QRegExp ...
- Java正则表达式例子汇总
1.过滤特殊字符 package com.sheepmu.text; /* * @author sheepmu */ public class HWCompetition { public stati ...
- notepad++正则表达式例子
1.匹配create table USR.APP ( 这样的字符串: create.*USR.APP\s+\(
随机推荐
- ios::sync_with_stdio(false)提高C++读写速度
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:ios::sync_with_stdio(false)提高C++读写速度 本文地址:h ...
- Perfmon - 脚本自动监控
PerfMon-Windows性能监视器是个好东西,可以辅助我们分析发生问题时间段服务器资源占用情况,但是部署性能计数器确实一个相当麻烦的事情,往往这种枯燥的事别人还做不了,只能由我们这些希望获取到P ...
- sublime Remote_encoding cp1252
"remote_encoding": "cp1252",才能连接远程ftp
- name(实例化类名).hbm.xml文件案例
[html] view plain copy print? <span xmlns="http://www.w3.org/1999/xhtml"><?xml ve ...
- Python 文件对象和方法
Python文件对象和方法 1.打开和关闭文件 Python提供了必要的函数和方法进行默认情况下的文件基本操作,我们可以用file对象做大部分文件操作. open()方法 我们必须先用Python内置 ...
- 用select模拟一个socket server成型版2
1.字典队列测试 import queue msg_dic={} msg_dic[1]=queue.Queue() msg_dic[1].put('hello') msg_dic[1].put('bo ...
- CentOS 访问控制列表(tcp wrappers)
1.TCP Wrappers是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用.比如说ssh.telnet.FTP等服务的请求,都会先受到TCP Wrappers的拦截. ...
- 【转】C# 利用反射动态创建对象
http://www.cnblogs.com/Jan_Dai/archive/2010/11/09/1872812.html Activator.CreateInstance(Type.GetType ...
- iphone手机与PC蓝牙出现感叹号且无法修复解决方案
解决方案如下: 1.需要下载Windows Mobile 6.5 的驱动 drvupdate-amd64.exe ,下载需要正版验证,手动安装驱动,具体步骤Google 2. 如果在BlueTooth ...
- [SDOI2013]淘金 数位DP
做了好久.... 大致思路: 求出前k大的方格之和即为答案, 先考虑一维的情况,设f[i]为数位上各个数相乘为i的数的总数,也就是对于数i,有f[i]个数它们各个位相乘为i, 再拓展到二维,根据乘法原 ...