专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » c语言正则表达式:C#正则表达式整理备忘 »正文

c语言正则表达式:C#正则表达式整理备忘

来源: 发布时间:星期五, 2009年1月9日 浏览:69次 评论:0
  有段时间正则表达式学习很火热很潮流当时在CSDN天就能看到好几个正则表达式帖子那段时间借助论坛以及Wrox Press出版C#串和正则表达式参考手册学习了些基础知识同时也为我在CSDN大概赚了1000分今天想起来去找C#串和正则表达式参考手册已经不知所踪了现在用到正则时候也比较少把以前笔记等整理以志不忘

  (1)“@”符号

  符下两ows表研究室火热当晨在“@”虽然并非C#正则表达式“成员”但是它经常和C#正则表达式出双入对“@”表示跟在它后面串是个“逐字串”不是很好理解举个例子以下两个声明是等效:

   x="D:My HuangMy Doc";

   y = @"D:My HuangMy Doc";

  事实上如果按如下声明C#将会报错“”在C#中用于实现转义如“n”换行:

   x = "D:My HuangMy Doc";

  (2)基本语法

  d 0-9数字

  D d补集(以所以为全集下同)即所有非数字

  w 单词指大小写字母、0-9数字、下划线

  W w补集

  s 空白包括换行符n、回车符r、制表符t、垂直制表符v、换页符f

  S s补集

  . 除换行符n外任意

  […] 匹配内所列出所有

  [^…] 匹配非内所列出

  下面提供些简单举例:

  Code

i = "n";
m = "3";
Regex r = Regex(@"D");
//同Regex r = Regex("D");
//r.IsMatch(i)结果:true
//r.IsMatch(m)结果:false
i = "%";
m = "3";
Regex r = Regex("[a-z0-9]");
//匹配小写字母或数字
//r.IsMatch(i)结果:false
//r.IsMatch(m)结果:true


  (3)定位

  “定位”所代表个虚它代表个位置你也可以直观地认为“定位”所代表是某个那个微小间隙

  ^ 表示其后必须位于开始处

  $ 表示其前面必须位于结束处

  b 匹配个单词边界

  B 匹配个非单词边界

  另外还包括:A 前面必须位于开始处z 前面必须位于结束处Z 前面必须位于结束处或者位于换行符前

  下面提供些简单举例:

  Code

i = "Live for nothing,die for something";
Regex r1 = Regex("^Live for nothing,die for something$");
//r1.IsMatch(i) true
Regex r2 = Regex("^Live for nothing,die for some$");
//r2.IsMatch(i) false
Regex r3 = Regex("^Live for nothing,die for some");
//r3.IsMatch(i) true
i = @"Live for nothing,
die for something";//多行
Regex r1 = Regex("^Live for nothing,die for something$");
Console.WriteLine("r1 match count:" + r1.Matches(i).Count);//0
Regex r2 = Regex("^Live for nothing,die for something$", RegexOptions.Multiline);
Console.WriteLine("r2 match count:" + r2.Matches(i).Count);//0
Regex r3 = Regex("^Live for nothing,rndie for something$");
Console.WriteLine("r3 match count:" + r3.Matches(i).Count);//1
Regex r4 = Regex("^Live for nothing,$");
Console.WriteLine("r4 match count:" + r4.Matches(i).Count);//0
Regex r5 = Regex("^Live for nothing,$", RegexOptions.Multiline);
Console.WriteLine("r5 match count:" + r5.Matches(i).Count);//0
Regex r6 = Regex("^Live for nothing,rn$");
Console.WriteLine("r6 match count:" + r6.Matches(i).Count);//0
Regex r7 = Regex("^Live for nothing,rn$", RegexOptions.Multiline);
Console.WriteLine("r7 match count:" + r7.Matches(i).Count);//0
Regex r8 = Regex("^Live for nothing,r$");
Console.WriteLine("r8 match count:" + r8.Matches(i).Count);//0
Regex r9 = Regex("^Live for nothing,r$", RegexOptions.Multiline);
Console.WriteLine("r9 match count:" + r9.Matches(i).Count);//1
Regex r10 = Regex("^die for something$");
Console.WriteLine("r10 match count:" + r10.Matches(i).Count);//0
Regex r11 = Regex("^die for something$", RegexOptions.Multiline);
Console.WriteLine("r11 match count:" + r11.Matches(i).Count);//1
Regex r12 = Regex("^");
Console.WriteLine("r12 match count:" + r12.Matches(i).Count);//1
Regex r13 = Regex("$");
Console.WriteLine("r13 match count:" + r13.Matches(i).Count);//1
Regex r14 = Regex("^", RegexOptions.Multiline);
Console.WriteLine("r14 match count:" + r14.Matches(i).Count);//2
Regex r15 = Regex("$", RegexOptions.Multiline);
Console.WriteLine("r15 match count:" + r15.Matches(i).Count);//2
Regex r16 = Regex("^Live for nothing,r$n^die for something$", RegexOptions.Multiline);
Console.WriteLine("r16 match count:" + r16.Matches(i).Count);//1
//对于个多行在设置了Multiline选项的后^和$将出现多次匹配
i = "Live for nothing,die for something";
m = "Live for nothing,die for some thing";
Regex r1 = Regex(@"bthingb");
Console.WriteLine("r1 match count:" + r1.Matches(i).Count);//0
Regex r2 = Regex(@"thingb");
Console.WriteLine("r2 match count:" + r2.Matches(i).Count);//2
Regex r3 = Regex(@"bthingb");
Console.WriteLine("r3 match count:" + r3.Matches(m).Count);//1
Regex r4 = Regex(@"bfor somethingb");
Console.WriteLine("r4 match count:" + r4.Matches(i).Count);//1
//b通常用于约束个完整单词


  (4)重复描述

  “重复描述”是体现C#正则表达式“很好很强大”地方的:

  {n} 匹配前面n次

  {n,} 匹配前面n次或多于n次

  {n,m} 匹配前面n到m次

  ? 匹配前面0或1次

  + 匹配前面1次或多于1次

  * 匹配前面0次或式于0次

  以下提供些简单举例:

  Code

x = "1024";
y = "+1024";
z = "1,024";
a = "1";
b="-1024";
c = "10000";
Regex r = Regex(@"^+?[1-9],?d{3}$");
Console.WriteLine("x match count:" + r.Matches(x).Count);//1
Console.WriteLine("y match count:" + r.Matches(y).Count);//1
Console.WriteLine("z match count:" + r.Matches(z).Count);//1
Console.WriteLine("a match count:" + r.Matches(a).Count);//0
Console.WriteLine("b match count:" + r.Matches(b).Count);//0
Console.WriteLine("c match count:" + r.Matches(c).Count);//0
//匹配1000到9999整数


  (5)择匹配

  C#正则表达式中 (|) 符号似乎没有个专门称谓姑且称的为“择匹配”吧事实上像[a-z]也是种择匹配只不过它只能匹配单个而(|)则提供了更大范围(ab|xy)表示匹配ab或匹配xy注意“|”和“”在此是个整体下面提供些简单举例:

  Code

x = "0";
y = "0.23";
z = "100";
a = "100.01";
b = "9.9";
c = "99.9";
d = "99.";
e = "00.1";
Regex r = Regex(@"^+?((100(.0+)*)|([1-9]?[0-9])(.d+)*)$");
Console.WriteLine("x match count:" + r.Matches(x).Count);//1
Console.WriteLine("y match count:" + r.Matches(y).Count);//1
Console.WriteLine("z match count:" + r.Matches(z).Count);//1
Console.WriteLine("a match count:" + r.Matches(a).Count);//0
Console.WriteLine("b match count:" + r.Matches(b).Count);//1
Console.WriteLine("c match count:" + r.Matches(c).Count);//1
Console.WriteLine("d match count:" + r.Matches(d).Count);//0
Console.WriteLine("e match count:" + r.Matches(e).Count);//0


  //匹配0到100最外层括号内包含两部分“(100(.0+)*)”“([1-9]?[0-9])(.d+)*”这两部分是“OR”关系即正则表达式引擎会先尝试匹配100如果失败则尝试匹配后个表达式(表示[0,100)范围中数字)

  (6)特殊匹配

  下面提供些简单举例:

  Code

x = "";
Regex r1 = Regex("^$");
Console.WriteLine("r1 match count:" + r1.Matches(x).Count);//1
Regex r2 = Regex(@"^$");
Console.WriteLine("r2 match count:" + r2.Matches(x).Count);//1
Regex r3 = Regex("^$");
Console.WriteLine("r3 match count:" + r3.Matches(x).Count);//0
//匹配“”
x = """;
Regex r1 = Regex("^"$");
Console.WriteLine("r1 match count:" + r1.Matches(x).Count);//1
Regex r2 = Regex(@"^""$");
Console.WriteLine("r2 match count:" + r2.Matches(x).Count);//1
//匹配双引号


  (7)组和非捕获组

  以下提供些简单举例:

  Code

x = "Live for nothing,die for something";
y = "Live for nothing,die for somebody";
Regex r = Regex(@"^Live ([a-z]{3}) no([a-z]{5}),die 1 some2$");
Console.WriteLine("x match count:" + r.Matches(x).Count);//1
Console.WriteLine("y match count:" + r.Matches(y).Count);//0
//正则表达式引擎会记忆“”中匹配到内容作为个“组”并且可以通过索引方式进行引用表达式中“1”用于反向引用表达式中出现个组即粗体标识个括号内容“2”则依此类推

x = "Live for nothing,die for something";
Regex r = Regex(@"^Live for no([a-z]{5}),die for some1$");
(r.IsMatch(x))
{
  Console.WriteLine("group1 value:" + r.Match(x).Groups[1].Value);//输出:thing
}
//获取组中内容注意此处是Groups[1]Groups[0]是整个匹配即整个变量x内容
x = "Live for nothing,die for something";
Regex r = Regex(@"^Live for no(?<g1>[a-z]{5}),die for some1$");
(r.IsMatch(x))
{
  Console.WriteLine("group1 value:" + r.Match(x).Groups["g1"].Value);//输出:thing
}
//可根据组名进行索引使用以下格式为标识个组名称(?<groupname>…)
x = "Live for nothing nothing";
Regex r = Regex(@"([a-z]+) 1");
(r.IsMatch(x))
{
  x = r.Replace(x, "$1");
  Console.WriteLine("var x:" + x);//输出:Live for nothing
}
//删除原串中重复出现“nothing”在表达式的外使用“$1”来引用第个组下面则是通过组名来引用:
x = "Live for nothing nothing";
Regex r = Regex(@"(?<g1>[a-z]+) 1");
(r.IsMatch(x))
{
  x = r.Replace(x, "${g1}");
  Console.WriteLine("var x:" + x);//输出:Live for nothing
}
x = "Live for nothing";
Regex r = Regex(@"^Live for no(?:[a-z]{5})$");
(r.IsMatch(x))
{
  Console.WriteLine("group1 value:" + r.Match(x).Groups[1].Value);//输出:(空)
}


  //在组前加上“?:”表示这是个“非捕获组”即引擎将不保存该组内容

  (8)贪婪和非贪婪

  正则表达式引擎是贪婪只要模式允许它将匹配尽可能多通过在“重复描述”(*,+)后面添加“?”可以将匹配模式改成非贪婪请看以下举例:

  Code

x = "Live for nothing,die for something";
Regex r1 = Regex(@".*thing");
(r1.IsMatch(x))
{
  Console.WriteLine("match:" + r1.Match(x).Value);//输出:Live for nothing,die for something
}
Regex r2 = Regex(@".*?thing");
(r2.IsMatch(x))
{
  Console.WriteLine("match:" + r2.Match(x).Value);//输出:Live for nothing
}


  (9)回溯和非回溯

  使用“(?>…)”方式进行非回溯声明由于正则表达式引擎贪婪特性导致它在某些情况下将进行回溯以获得匹配请看下面举例:

  Code

x = "Live for nothing,die for something";
Regex r1 = Regex(@".*thing,");
(r1.IsMatch(x))
{
  Console.WriteLine("match:" + r1.Match(x).Value);//输出:Live for nothing,
}
Regex r2 = Regex(@"(?>.*)thing,");
(r2.IsMatch(x))//不匹配
{
  Console.WriteLine("match:" + r2.Match(x).Value);
}
//在r1中“.*”由于其贪婪特性直匹配到最后随后匹配“thing”但在匹配“,”时失败此时引擎将回溯并在“thing,”处匹配成功

  在r2中由于强制非回溯所以整个表达式匹配失败

  (10)正向预搜索、反向预搜索

  正向预搜索声明格式:正声明 “(?=…)”负声明 “(?!...)” 声明本身不作为最终匹配结果部分请看下面举例:

  Code

x = "1024 used 2048 free";
Regex r1 = Regex(@"d{4}(?= used)");
(r1.Matches(x).Count1)
{
  Console.WriteLine("r1 match:" + r1.Match(x).Value);//输出:1024
}
Regex r2 = Regex(@"d{4}(?! used)");
(r2.Matches(x).Count1)
{
  Console.WriteLine("r2 match:" + r2.Match(x).Value); //输出:2048
}


  //r1中正声明表示必须保证在 4位数字后面必须紧跟着“ used”r2中负声明表示 4位数字的后不能跟有“ used”

  反向预搜索声明格式:正声明“(?<=)”负声明“(?<!)”声明本身不作为最终匹配结果部分请看下面举例:

  Code

x = "used:1024 free:2048";
Regex r1 = Regex(@"(?<=used:)d{4}");
(r1.Matches(x).Count1)
{
  Console.WriteLine("r1 match:" + r1.Match(x).Value);//输出:1024
}
Regex r2 = Regex(@"(?<!used:)d{4}");
(r2.Matches(x).Count1)
{
  Console.WriteLine("r2 match:" + r2.Match(x).Value);//输出:2048
}
//r1中反向正声明表示在4位数字的前必须紧跟着“used:”r2中反向负声明表示在4位数字的前必须紧跟着除“used:”的外

  (11)十 6进制范围

  正则表达式中可以使用 "xXX" 和 "uXXXX" 表示("X" 表示个十 6进制数)形式范围:

  xXX    编号在 0到255 范围比如:空格可以使用 "x20" 表示

  uXXXX  任何可以使用 "u" 再加上其编号4位十 6进制数表示比如:汉字可以使用“[u4e00-u9fa5]”表示

  (12)对[0,100]比较完备匹配

  下面是个比较综合举例对于匹配[0,100]需要特殊考虑地方包括

  *00合法00.合法00.00合法001.100合法

  *空串不合法仅小数点不合法大于100不合法

  *数值是可带后缀如“1.07f”表示该值为个float类型(未考虑)

  Code

Regex r = Regex(@"^+?0*(?:100(.0*)?|(d{0,2}(?=.d)|d{1,2}(?=($|.$)))(.d*)?)$");
x = "";
while (true)
{
  x = Console.ReadLine;
   (x != "exit")
  {
     (r.IsMatch(x))
    {
      Console.WriteLine(x + " succeed!");
    }
    
    {
      Console.WriteLine(x + " failed!");
    }
  }
  
  {
    ;
  }
}


  (13)精确匹配有时候是困难

  有些需求要做到精确匹配比较困难例如:日期、Url、Email地址等其中些你甚至需要研究些专门文档写出精确完备表达式对于这种情况只能退而求其次保证比较精确匹配例如对于日期可以基于应用系统实际情况考虑段较短时间或者对于像Email匹配可以只考虑最常见形式

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: