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);