Regex

正则表达式的类,我们可以通过该类来使用正则表达式。

比如下面我们使用Regex来判断输入的字符串是否符合指定的格式:

  1. using System;
  2. using System.Text.RegularExpressions;
  3.  
  4. namespace Study
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. string[] strs = new[] {"111-22-3333", "444-5-6666"};
  11. string patten = @"^\d{3}-\d{2}-\d{4}$";
  12.  
  13. foreach (string str in strs)
  14. {
  15. if (Regex.IsMatch(str, patten))
  16. {
  17. Console.WriteLine(str);
  18. }
  19. }
  20.  
  21. Console.ReadKey();
  22. }
  23. }
  24. }

运行发现返回的是“111-22-3333”。

Match和Group

我们如果需要得到匹配的信息,则会使用到Match类,该类记录了字符串中的所有符合的匹配项的匹配信息。

而如果需要得到匹配项中的分组则可以使用Group属性。

下面我们来看一个具体的例子,该例子是我目前工作中遇到的一个扯淡的问题,具体就是要把类似"heroData.name = "Li Lei";"和"string name = heroData.name;"替换为Java类型的写法,如"heroData.setName("Li Lei");"和"string name = heroData.getName();",由于量太大,所以如果手改,我估计我会死的,那么下面我们就用C#的正则表达式来帮我们自动完成这个过程,代码如下,带有注释大家自己看了:

  1. using System;
  2. using System.Text.RegularExpressions;
  3.  
  4. namespace Study
  5. {
  6. class Program
  7. {
  8. //要处理的代码
  9. private const string CODE = @"
  10.  
  11. //我是设置示例代码
  12. HeroData heroData = new HeroData();
  13. heroData.name = ""LiLei"";
  14. heroData.age = 18;
  15. heroData.skill = SkillData.datas[0];
  16. heroData.PlaySkill();
  17.  
  18. //我是不应该被替换的
  19. skillInfo.name = ""DaJueZhao"";
  20.  
  21. //我是读取的示例代码
  22. string name = heroData.name;
  23. int age = heroData.age;
  24. Debug.Log(""Name: "" + name + "", Age: "" + age);
  25.  
  26. ";
  27.  
  28. //我们需要设定一个前缀来保证匹配的精确
  29. private const string PREFIX = "heroData";
  30.  
  31. static void Main(string[] args)
  32. {
  33. string result;
  34.  
  35. result = ProcessSet(CODE, PREFIX);
  36. result = ProcessGet(result, PREFIX);
  37.  
  38. Console.Write(result);
  39.  
  40. Console.ReadKey();
  41. }
  42.  
  43. private static string ProcessSet(string code, string prefixName)
  44. {
  45. string result = code;
  46.  
  47. //用于匹配的表达式
  48. string patten = prefixName + @"\.([0-9a-zA-Z_$]*)\s*=\s*([0-9a-zA-Z_$""\.\[\]]*)\s*;";
  49. //string patten = prefixName + "\\.([0-9a-zA-Z_$]*)\\s*=\\s*([0-9a-zA-Z_$"\\.\\[\\]]*)\\s*;"; //不用 @ 的写法
  50.  
  51. Match match = Regex.Match(code, patten);
  52. //存在匹配项
  53. while (match.Success)
  54. {
  55. //获取整个匹配的字符串
  56. string allStr = match.Groups[].Value;
  57. //获取属性名称
  58. string attrName = match.Groups[].Value;
  59. //获取值
  60. string attrValue = match.Groups[].Value;
  61.  
  62. //获取修改后的字符串
  63. string modifyStr = prefixName + ".set" + FirstCharUpper(attrName) + "(" + attrValue + ");";
  64.  
  65. //替换
  66. result = result.Replace(allStr, modifyStr);
  67.  
  68. //查询下一个匹配项
  69. match = match.NextMatch();
  70. }
  71.  
  72. return result;
  73. }
  74.  
  75. private static string ProcessGet(string code, string prefixName)
  76. {
  77. string result = code;
  78.  
  79. //用于匹配的表达式
  80. string patten = prefixName + @"\.([0-9a-zA-Z_$]*)\s*;";
  81. //string patten = prefixName + "\\.([0-9a-zA-Z_$]*)\\s*;"; //不用 @ 的写法
  82.  
  83. Match match = Regex.Match(code, patten);
  84. //存在匹配项
  85. while (match.Success)
  86. {
  87. //获取整个匹配的字符串
  88. string allStr = match.Groups[].Value;
  89. //获取属性名称
  90. string attrName = match.Groups[].Value;
  91.  
  92. //获取修改后的字符串
  93. string modifyStr = prefixName + ".get" + FirstCharUpper(attrName) + "();";
  94.  
  95. //替换
  96. result = result.Replace(allStr, modifyStr);
  97.  
  98. //查询下一个匹配项
  99. match = match.NextMatch();
  100. }
  101.  
  102. return result;
  103. }
  104.  
  105. private static string FirstCharUpper(string str)
  106. {
  107. return str.Substring(, ).ToUpper() + str.Substring();
  108. }
  109. }
  110. }

运行结果如下:

  1. //我是设置示例代码
  2. HeroData heroData = new HeroData();
  3. heroData.setName("LiLei");
  4. heroData.setAge();
  5. heroData.setSkill(SkillData.datas[]);
  6. heroData.PlaySkill();
  7.  
  8. //我是不应该被替换的
  9. skillInfo.name = "DaJueZhao";
  10.  
  11. //我是读取的示例代码
  12. string name = heroData.getName();
  13. int age = heroData.getAge();
  14. Debug.Log("Name: " + name + ", Age: " + age);

C#学习笔记(十二):正则表达式的更多相关文章

  1. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  2. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  3. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  4. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

  5. Python学习笔记(十二)—Python3中pip包管理工具的安装【转】

    本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  6. ROS学习笔记十二:使用gazebo在ROS中仿真

    想要在ROS系统中对我们的机器人进行仿真,需要使用gazebo. gazebo是一种适用于复杂室内多机器人和室外环境的仿真环境.它能够在三维环境中对多个机器人.传感器及物体进行仿真,产生实际传感器反馈 ...

  7. JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)

    1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...

  8. MySQL学习笔记十二:数据备份与恢复

    数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...

  9. Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

    不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...

  10. Python学习笔记十二

    HTML全称:Hyper Text Markup Language超文本标记语言 不是编程语言 HTML使用标记标签来描述网页 2.  HTML标签 开始标签,结束标签.  例如:<html&g ...

随机推荐

  1. ganglia对于tomcat进程的res内存监控扩展

    ganglia是采用yum的安装,因此安装相关内容路径可能不同,但是不影响插件的扩展编写: 本次介绍的扩展是采用python脚本进行扩展,因此监控节点上需要安装python的相关插件: sudo yu ...

  2. Nginx - 指定log_format,常用于 Awstats 分析

    1. vim /etc/nginx/nginx.conf (下面格式, Awstats 使用) log_format new_log '$remote_addr - $remote_user [$ti ...

  3. zoj 2027 Travelling Fee

    // 题意 : 一个人要去旅行 给你起点和终点 求最少花费 其中花费为经过路径的总费用减去该路径的中的最大花费段// 直接搜索 稍微加了个剪枝 主要是数据规模小#include <iostrea ...

  4. IE下JS接受ActiveX控件方法

    1.常规写法 <SCRIPT type="text/javascript" FOR="activexID" EVENT="onXXXevent( ...

  5. 在delphi中, reintroduce作用

    在delphi中, reintroduce作用 当在子类中重载或者重新声明父类的虚方法时,使用     reintroduce   关键字告知编译器,可以消除警告信息.如:          TPar ...

  6. MySQL基础之第4章 MySQL数据类型

    4.1.整数类型 tinyint(4)smallint(6)mediumint(9)int(11)bigint(20) 注意:后面的是默认显示宽度,以int为例,占用的存储字节数是4个,即4*8=32 ...

  7. 【转】一致性hash算法(consistent hashing)

    consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 cache 系统中应用越来越广泛: 1  ...

  8. ural 1297(后缀数组+RMQ)

    题意:就是让你求一个字符串中的最长回文,如果有多个长度相等的最长回文,那就输出第一个最长回文. 思路:这是后缀数组的一种常见的应用,首先把原始字符串倒转过来,然后接在原始字符串的后面,中间用一个不可能 ...

  9. 自定义TreeList单元格 z

    DevExpress Treelist自定义单元格,加注释和行序号.以上一节的列表为例,实现以下效果:预算大于110万的单元格突出显示,加上行序号以及注释,如下图: 添加行序号要用到CustomDra ...

  10. python测试基于websocket协议的即时通讯接口

    随着html5的广泛应用,基于websocket协议的即时通讯有了越来越多的使用场景,本文使用python中的websocket-client模块来做相关的接口测试 import webclient ...