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+\(
随机推荐
- C#命名参数
文章:史上最全的ASP.NET MVC路由配置,以后RouteConfig再弄不懂神仙都难救你啦~ 命名参数规范+匿名对象 routes.MapRoute(name: "Default&qu ...
- TCP系列17—重传—7、SACK下的重传
我们之前介绍SACK选项的时候说过,SACK可以把接收端系列号空间的洞反映给发送端,因此发送端可以更充分的理解接收端的情况,而进行更好的重传恢复过程.这种过程有时候也叫做advanced loss r ...
- alpha阶段个人总结(201521123034陈凯欣)
一.个人总结 第 0 部分:基本数据结构和算法问题 大二的时候上过数据结构课,感觉自己没有学的太深入,就如之前结对编程时候四则运算有用到的二叉树来解决问题,对于二叉树就有个模糊的概念,实际动手操作起来 ...
- 【Linux】- Ubuntu安装nginx
安装 执行命令: sudo apt-get install nginx 执行如图: 防火墙设置 查看防火墙状态: sudo ufw status 查看可以穿过防火墙的应用列表: sudo ufw ap ...
- 在线api查询网站
1.包含各种常用的语言 http://tool.oschina.net/apidocs
- 微信小程序 功能函数 计时器
let lovetime = setInterval(function () { let str = '(' + n + ')' + '重新获取' that.setData({ getText2: s ...
- tc:逼良为娼
tc的学习原来是想着直接从用户态学习的,但是万万没想到哇,qdisc class两个概念直接把我给搞晕了,直接看代码吧 调用:tc qdisc add dev tap0 root handle 1: ...
- BZOJ4289 PA2012Tax(最短路)
一个暴力的做法是把边看成点,之间的边权为两边的较大权值,最短路即可.但这样显然会被菊花图之类的卡掉. 考虑优化建图.将边拆成两个有向边,同样化边为点.原图中同一条边在新图中的两个点之间连边权为原边权的 ...
- Python fileinput模块详解
Python的fileinput模块可以快速对一个或多个文件进行循环遍历. import fileinput for line in fileinput.input(): process(line) ...
- [POI2007]ZAP-Queries && [HAOI2011]Problem b 莫比乌斯反演
1,[POI2007]ZAP-Queries ---题面---题解: 首先列出式子:$$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}[gcd(i, j) == d]$$ ...