Regex

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

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

 using System;
using System.Text.RegularExpressions; namespace Study
{
class Program
{
static void Main(string[] args)
{
string[] strs = new[] {"111-22-3333", "444-5-6666"};
string patten = @"^\d{3}-\d{2}-\d{4}$"; foreach (string str in strs)
{
if (Regex.IsMatch(str, patten))
{
Console.WriteLine(str);
}
} Console.ReadKey();
}
}
}

运行发现返回的是“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#的正则表达式来帮我们自动完成这个过程,代码如下,带有注释大家自己看了:

 using System;
using System.Text.RegularExpressions; namespace Study
{
class Program
{
//要处理的代码
private const string CODE = @" //我是设置示例代码
HeroData heroData = new HeroData();
heroData.name = ""LiLei"";
heroData.age = 18;
heroData.skill = SkillData.datas[0];
heroData.PlaySkill(); //我是不应该被替换的
skillInfo.name = ""DaJueZhao""; //我是读取的示例代码
string name = heroData.name;
int age = heroData.age;
Debug.Log(""Name: "" + name + "", Age: "" + age); "; //我们需要设定一个前缀来保证匹配的精确
private const string PREFIX = "heroData"; static void Main(string[] args)
{
string result; result = ProcessSet(CODE, PREFIX);
result = ProcessGet(result, PREFIX); Console.Write(result); Console.ReadKey();
} private static string ProcessSet(string code, string prefixName)
{
string result = code; //用于匹配的表达式
string patten = prefixName + @"\.([0-9a-zA-Z_$]*)\s*=\s*([0-9a-zA-Z_$""\.\[\]]*)\s*;";
//string patten = prefixName + "\\.([0-9a-zA-Z_$]*)\\s*=\\s*([0-9a-zA-Z_$"\\.\\[\\]]*)\\s*;"; //不用 @ 的写法 Match match = Regex.Match(code, patten);
//存在匹配项
while (match.Success)
{
//获取整个匹配的字符串
string allStr = match.Groups[].Value;
//获取属性名称
string attrName = match.Groups[].Value;
//获取值
string attrValue = match.Groups[].Value; //获取修改后的字符串
string modifyStr = prefixName + ".set" + FirstCharUpper(attrName) + "(" + attrValue + ");"; //替换
result = result.Replace(allStr, modifyStr); //查询下一个匹配项
match = match.NextMatch();
} return result;
} private static string ProcessGet(string code, string prefixName)
{
string result = code; //用于匹配的表达式
string patten = prefixName + @"\.([0-9a-zA-Z_$]*)\s*;";
//string patten = prefixName + "\\.([0-9a-zA-Z_$]*)\\s*;"; //不用 @ 的写法 Match match = Regex.Match(code, patten);
//存在匹配项
while (match.Success)
{
//获取整个匹配的字符串
string allStr = match.Groups[].Value;
//获取属性名称
string attrName = match.Groups[].Value; //获取修改后的字符串
string modifyStr = prefixName + ".get" + FirstCharUpper(attrName) + "();"; //替换
result = result.Replace(allStr, modifyStr); //查询下一个匹配项
match = match.NextMatch();
} return result;
} private static string FirstCharUpper(string str)
{
return str.Substring(, ).ToUpper() + str.Substring();
}
}
}

运行结果如下:

 //我是设置示例代码
HeroData heroData = new HeroData();
heroData.setName("LiLei");
heroData.setAge();
heroData.setSkill(SkillData.datas[]);
heroData.PlaySkill(); //我是不应该被替换的
skillInfo.name = "DaJueZhao"; //我是读取的示例代码
string name = heroData.getName();
int age = heroData.getAge();
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. 页面多个Jquery版本共存的冲突问题,解决方法!

    示例如下: <script type="text/javascript" src="jquery.js"></script> <s ...

  2. UVA 10917 Walk Through the Forest(dijkstra+DAG上的dp)

    用新模板阿姨了一天,换成原来的一遍就ac了= = 题意很重要..最关键的一句话是说:若走A->B这条边,必然是d[B]<d[A],d[]数组保存的是各点到终点的最短路. 所以先做dij,由 ...

  3. busybox filesystem udhcpc 原理

    /******************************************************************** * busybox filesystem udhcpc 原理 ...

  4. 让你的 Node.js 应用跑得更快的 10 个技巧(转)

    Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...

  5. 搭建LAMP测试环境

    LAMP:Linux+Apache+Mysql+Php,组合统称为LAMP,关于其中的独立个体,这里就不多介绍了. 1.首先准备一下软件包,如下: mysql-5.0.22.tar.gz httpd- ...

  6. 转载RabbitMQ入门(1)--介绍

    目录[-] "Hello World" (使用java客户端) 发送 接收 把所有放在一起 前面声明本文都是RabbitMQ的官方指南翻译过来的,由于本人水平有限难免有翻译不当的地 ...

  7. 擦亮自己的眼睛去看SQLServer之简单Insert(转)

    摘要:本来是打算先写SQLServer历史的,不过感觉写那部分内容比较难还需要多查些资料.于是调整了下顺序写下简单的Insert语句. 不过感觉写那部分内容比较难还需要多查些资料.于是调整了下顺序写下 ...

  8. C# 替换文本文件中的某一行

    C# 替换文本文件中的某一行 (要求此文件存在) /// <summary> /// LineIndex 表示新的内容所在的行位置 /// </summary> /// < ...

  9. poj-3056 http://poj.org/problem?id=3056

    http://poj.org/problem?id=3056 The Bavarian Beer Party Time Limit: 6000MS   Memory Limit: 65536K Tot ...

  10. Oracle中表结构和表内容复制

    处理该问题注意以下几点: 1. 清空表中数据SQL:truncate table table_name; 2.复制表结构SQL:create table table_name1 as select * ...