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 属性可能是多种多样的,所以提取方法不能写死。

当时时间紧急,对正则表达式也不熟,按照字符串分割的方法实现了。

代码如下:

  1 void TestFormula(std::string& for_text)
  2 {
  3     using std::string;
  4     using std::vector;
  5     string::size_type pos = 0;
  6     string searchStr = "->";
  7     string replaceStr = "#";
  8
  9     if (for_text.find(searchStr) == string::npos)
 10     {
 11         return;
 12     }
 13
 14     while ( (pos = for_text.find(searchStr, pos)) != string::npos)
 15     {
 16         if ((for_text.size() >= pos + 2 && for_text[pos + 2] == ‘m‘) || (for_text.size() >= pos + 3 && for_text[pos + 3] == ‘m‘ && for_text[pos + 2] >= ‘0‘ && for_text[pos + 2] <= ‘9‘))
 17         {
 18             for_text.replace(pos, searchStr.size(), replaceStr);
 19         }
 20         pos++;
 21     }
 22
 23     vector<string> lVector;
 24     vector<string> rVector;
 25     int lastSplitIdx = 0;
 26     string lastText("");
 27     for (string::size_type i = 0; i < for_text.size(); i++)
 28     {
 29         if (for_text[i] == ‘+‘ || for_text[i] == ‘-‘ || for_text[i] == ‘*‘ || for_text[i] == ‘/‘
 30             || for_text[i] == ‘#‘ || for_text[i] == ‘(‘ || for_text[i] == ‘)‘ || for_text[i] == ‘,‘)
 31         {
 32             if (for_text[i] == ‘#‘)
 33             {
 34                 lastText = for_text.substr(lastSplitIdx, i - lastSplitIdx);
 35             }
 36             else
 37             {
 38                 if (lastText.size() > 0)
 39                 {
 40                     lVector.push_back(lastText);
 41                     rVector.push_back(for_text.substr(lastSplitIdx, i - lastSplitIdx));
 42                 }
 43                 lastText = "";
 44             }
 45             lastSplitIdx = i + 1;
 46         }
 47     }
 48     if (lastSplitIdx != for_text.size())
 49     {
 50         if (lastText.size() > 0)
 51         {
 52             lVector.push_back(lastText);
 53             rVector.push_back(for_text.substr(lastSplitIdx, lastText.size() - lastSplitIdx));
 54         }
 55     }
 56
 57     if (lVector.size() == 0 || rVector.size() == 0 || lVector.size() != rVector.size())
 58     {
 59         return;
 60     }
 61
 62     pos = 0;
 63     int parseIdx = 0;
 64     while ( ( pos = for_text.find(replaceStr, pos)) != string::npos)
 65     {
 66         string leftStr = lVector.at(parseIdx);
 67         string rightStr = rVector.at(parseIdx);
 68         string oldStr = leftStr + replaceStr + rightStr;
 69         string category = rightStr.substr(0, 1);
 70         string ower = leftStr;
 71         if (category == "0" || category == "1" || category == "2" || category == "3" || category == "4")
 72         {
 73             rightStr = rightStr.substr(1, rightStr.size());
 74         }
 75         else
 76         {
 77             category = "0";
 78         }
 79         if (leftStr.find("self", 0) != string::npos)
 80         {
 81             ower = "src";
 82         }
 83         else if (leftStr.find("target", 0) != string::npos)
 84         {
 85             ower = "dst";
 86         }
 87         string newStr = ower + ":lf_" + rightStr + "(" + category + ")";
 88         for_text.replace(pos - leftStr.size(), oldStr.size(), newStr);
 89         parseIdx++;
 90         pos++;
 91     }
 92 }
 93 int main()
 94 {
 95     std::string text("self->mHp*2+target->2mMp*GetHit()+self_mon->4mDan/1000");
 96     std::cout << text.c_str() << std::endl;
 97     TestFormula(text);
 98     std::cout<<text.c_str()<<std::endl;
 99
100     return 0;
101 }    

运行结果:

颇费周折有木有~~~,还有很多临界状态需要检查,一不留神可能就踩到坑里了。

索性,看了看正则表达式,发现非常好用。代码少很多,结果一模一样。

 1 void TestFormulaRegex(std::string& for_text)
 2 {
 3     using std::string;
 4     std::regex pat("([A-Za-z_]+)->([0-4]*)(m[A-Za-z]+)");
 5     string::const_iterator startPos = for_text.begin();
 6     string::const_iterator endPos = for_text.end();
 7     std::smatch mat;
 8     while (std::regex_search(startPos, endPos, mat, pat))
 9     {
10         string object(mat[1].first, mat[1].second);
11         string category(mat[2].first, mat[2].second);
12         string attrName(mat[3].first, mat[3].second);
13         if (category.compare("") == 0)
14         {
15             category = "0";
16         }
17         if (object.find("self", 0) != string::npos)
18         {
19             object = "src";
20         }
21         else if (object.find("target", 0) != string::npos)
22         {
23             object = "dst";
24         }
25         string replaceStr(object + ":lf_" + attrName + "(" + category + ")");
26         for_text.replace(mat[0].first, mat[0].second, replaceStr);
27         startPos = for_text.begin();
28         endPos = for_text.end();
29     }
30 }
时间: 2024-10-29 22:26:52

C++正则表达式例子的相关文章

pyqt 正则表达式例子学习

def rex01(self): username=QtCore.QRegExp('[a-zA-Z0-9_]{2,10}') self.names.setValidator(QtGui.QRegExpValidator(username,self)) mainname=QtCore.QRegExp("^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$") self.mains.setValidator(QtGui.QRegExpValidator(mainnam

ios-字符串替换-正则表达式-例子

需求:在html中查找并替换相应的html标签 代码实现 - (NSString *)replaceImageHtml:(NSString *)oldHtml { NSString *regex = @"(<img.*?/>)"; NSRange r; NSMutableString *newHtml = [NSMutableString stringWithString:oldHtml]; BOOL flag = false; while (flag == false)

Perl正则表达式例子

Perl正则表达式 一.介绍 正则表达式各语言都有自己的规范,但是基本都差不多,都是由元字符的组合来进行匹配:由于Nmap内嵌的服务与版本探测是使用的Perl正则规范,因此此篇博客记录一下Perl正则的相关内容,方便后期查阅. 二.Perl正则例子 下面的例子可能有不足之处,有些来源于博客,没有验证:1. 匹配IP地址:\d+\.\d+\.\d+\.\d+ \d:匹配一个数字字符,\d+:匹配一次或多次数字字符. \.:使用转义字符匹配'.'. 2. 匹配邮箱类似于[email protecte

python正则表达式例子说明

pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?'+ 'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S) 现在正则表达式在这里稍

正则表达式-例子学习

正则表达式是一个编程的艺术,很难调试,学习和理解,但强大的功能,仍吸引不少开发者编写正则表达式.让我们探索一下下面10个实际应用中的正则表达式. 1. 用户名正则表达式模式^[a-z0-9_-]{3,15}$^ # 行开始[a-z0-9_-] # 匹配列表中的字符,a-z,0–9,下划线,连字符{3,15} # 长度至少3个字符,最大长度为15$ # 行结束 2. 密码正则表达式模式((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})( # 组开

Java正则表达式应用总结

http://lavasoft.blog.51cto.com/ http://lavasoft.blog.51cto.com/62575/179324    Java正则表达式应用总结 一.概述 正则表达式是Java处理字符串.文本的重要工具. Java对正则表达式的处理集中在以下两个两个类: java.util.regex.Matcher   模式类:用来表示一个编译过的正则表达式. java.util.regex.Pattern   匹配类:用模式匹配一个字符串所表达的抽象结果. (很遗憾,

1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用

简介: 本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及JAVA中原生正则表达式引擎的使用.在后续的文章中会涉及基于NFA的正则表达式引擎内部的工作原理,并在此基础上用1000行左右的JAVA代码,实现一个支持常用功能的正则表达式引擎.它支持贪婪匹配和懒惰匹配:支持零宽度字符(如"\b", "\B"):支持常用字符集(如"\d", "\s"等):支持自定义字符集("[a-f]","[^b-

自己动手开发编译器(二)正则语言和正则表达式

从今天这一篇起,我们就来正式揭开编译器的奥秘.首先我们接触到的模块是词法分析器,也叫词法扫描器,代码里我常常叫它Scanner.昨天我稍微解释了一下为什么需要将词法分析单独分离出来,今天来回顾一下这个问题.请看下面这段C#代码: string str = "Hello World"; 即使没有语法高亮,这段代码也可以很明显地分成好几部分.首先是关键字string,之后是变量名str,然后是等号=,接下来是一个字符串字面常量”Hello World”.现代语言如C#这样的,都能明显地将源

NSRegularExpression iOS自带的正则表达式

以前做验证邮箱,电话号码的时候通常用第三方的正则表达式或者NSPredicate(点这里查看以前的文章),在后期,苹果推出了自己的正则表达式来提供给开发者调用,很方便,功能也强大. 具体可以查看官方文档,包括如何书写进行匹配的正则表达式例子,这里我就不多加详述了,因为本人看那一堆符号好烦.....只好直接求助于谷歌了,下面只给出几个常用的. #define KPhoneRegex @"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|