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+\(
随机推荐
- MFC最基本动作(如创建窗口,点击取消等)函数的执行顺序
一.MFC应用程序中处理消息的顺序: 1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc2.AfxCallWndProc() ...
- python实现post请求
今天无论如何都要留下一些什么东西... 可以说今天学到一个新的一个东西,也需要分享出来,给更多的人去使用. 今天爬取的数据里面是客户端向服务器端发送加密过的token和一些页码之类的一个数据.(我主要 ...
- linux查看资源占用情况
在Linux中查看占用空间大文件 查看当前目录总共占的容量.而不单独列出各子项占用的容量$ du -sh查看当前目录下一级子文件和子目录占用的磁盘容量.$ du -lh --max-depth=1结果 ...
- Sass的命令编译
[Sass]命令编译 命令编译是指使用你电脑中的命令终端,通过输入 Sass 指令来编译 Sass.这种编译方式是最直接也是最简单的一种方式.因为只需要在你的命令终端输入: 单文件编译: sass & ...
- python2 对URL编码进行编译
在请求页面时有时会返回类似: %E8%AF%A5985%E5%A4%A7%E5%AD%A6%E5%B8%B8%E5%B9%B4%E4%BD%8D%E5%B1%85%E5%9B%BD%E5%86%85% ...
- Delphi Dataset CurValue
TField.CurValue Property Represents the current value of the field component including changes made ...
- WPF 分页控件的实现 -用户控件
效果图:
- 【】Python】异常处理try...except、raise
一.try...except 有时候我们写程序的时候,会出现一些错误或异常,导致程序终止.例如,做除法时,除数为0,会引起一个ZeroDivisionError 例子: 1 2 3 4 a=10 b= ...
- BZOJ 2306 幸福路径(DP)
题解来源:http://www.cnblogs.com/jianglangcaijin/p/3799494.html 最后必然是走了一条链,或者是一个环(一直绕),或者是一条链加一个环.设f[i][j ...
- 【题解】SCOI2007组队
恩……为什么大家都这么执着于 \(O(n^{2})\) 的复杂度捏?如果接受 \(O(n^{2} + nV)\) 的复杂度,那这题可不是道**题吗( • ̀ω•́ )✧ 首先把所有的人按照身高排个序, ...