C#字符串和正则表达式参考手册

1#region 获得字符串中开始和结束字符串之间的值 2 /// <summary> 3 /// 获得字符串中开始和结束字符串之间的值 4 /// </summary> 5 /// <param name="str">字符串</param> 6 /// <param name="s">开始</param> 7 /// <param name="e">结束</param> 8 /// <returns></returns> 9 public static string GetValue(string str, string s, string e) 10 { 11 Regex rg = new Regex("(?<=(" + s + "))[.\\s\\S]*?(?=(" + e + "))", RegexOptions.Multiline | RegexOptions.Singleline); 12 return rg.Match(str).Value; 13 } 14 #endregion 15 16(1)“@”符号 17符下两ows表研究室的火热,当晨在“@”虽然并非C#正则表达式的“成员”,但是它经常与C#正则表达式出双入对。“@”表示,跟在它后面的字符串是个“逐字字符串”,不是很好理解,举个例子,以下两个声明是等效的: 18string x="D://My Huang//My Doc"; 19string y = @"D:/My Huang/My Doc"; 20事实上,如果按如下声明,C#将会报错,因为“/”在C#中用于实现转义,如“/n”换行: 21string x = "D:/My Huang/My Doc"; 22 23(2)基本的语法字符。 24/d 0-9的数字 25/D /d的补集(以所以字符为全集,下同),即所有非数字的字符 26/w 单词字符,指大小写字母、0-9的数字、下划线 27/W /w的补集 28/s 空白字符,包括换行符/n、回车符/r、制表符/t、垂直制表符/v、换页符/f 29/S /s的补集 30. 除换行符/n外的任意字符 31[…] 匹配[]内所列出的所有字符 32[^…] 匹配非[]内所列出的字符 33下面提供一些简单的示例: 34 35string i = "/n"; 36string m = "3"; 37Regex r = new Regex(@"/D"); 38//同Regex r = new Regex("//D"); 39//r.IsMatch(i)结果:true 40//r.IsMatch(m)结果:false 41 42string i = "%"; 43string m = "3"; 44Regex r = new Regex("[a-z0-9]"); 45//匹配小写字母或数字字符 46//r.IsMatch(i)结果:false 47//r.IsMatch(m)结果:true 48 49#region 匹配小写字母或数字字符 50string i001 = "123dsadsadZZ21421"; 51Regex r001 = new Regex("[a-z0-9]"); 52foreach (Match item in r001.Matches(i001)) 53{ 54 Response.Write(item + "<br/>"); 55} 56#endregion 57 58#region 匹配非数字字符 59string i002 = "123dsads中国adZZ21421"; 60Regex r002 = new Regex("[^0-9]"); 61MatchCollection mc = r002.Matches(i002); 62foreach (Match item in mc) 63{ 64 Response.Write(item + "<br/>"); 65} 66#endregion 67 68(3)定位字符 69“定位字符”所代表的是一个虚的字符,它代表一个位置,你也可以直观地认为“定位字符”所代表的是某个字符与字符间的那个微小间隙。 70^ 表示其后的字符必须位于字符串的开始处 71$ 表示其前面的字符必须位于字符串的结束处 72/b 匹配一个单词的边界 73/B 匹配一个非单词的边界 74另外,还包括:/A 前面的字符必须位于字符处的开始处,/z 前面的字符必须位于字符串的结束处,/Z 前面的字符必须位于字符串的结束处,或者位于换行符前 75下面提供一些简单的示例: 76 77string i = "Live for nothing,die for something"; 78Regex r1 = new Regex("^Live for nothing,die for something$"); 79//r1.IsMatch(i) true 80Regex r2 = new Regex("^Live for nothing,die for some$"); 81//r2.IsMatch(i) false 82Regex r3 = new Regex("^Live for nothing,die for some"); 83//r3.IsMatch(i) true 84 85string i = @"Live for nothing, 86die for something";//多行 87Regex r1 = new Regex("^Live for nothing,die for something$"); 88Console.WriteLine("r1 match count:" + r1.Matches(i).Count);//0 89Regex r2 = new Regex("^Live for nothing,die for something$", RegexOptions.Multiline); 90Console.WriteLine("r2 match count:" + r2.Matches(i).Count);//0 91Regex r3 = new Regex("^Live for nothing,/r/ndie for something$"); 92Console.WriteLine("r3 match count:" + r3.Matches(i).Count);//1 93Regex r4 = new Regex("^Live for nothing,$"); 94Console.WriteLine("r4 match count:" + r4.Matches(i).Count);//0 95Regex r5 = new Regex("^Live for nothing,$", RegexOptions.Multiline); 96Console.WriteLine("r5 match count:" + r5.Matches(i).Count);//0 97Regex r6 = new Regex("^Live for nothing,/r/n$"); 98Console.WriteLine("r6 match count:" + r6.Matches(i).Count);//0 99Regex r7 = new Regex("^Live for nothing,/r/n$", RegexOptions.Multiline); 100Console.WriteLine("r7 match count:" + r7.Matches(i).Count);//0 101Regex r8 = new Regex("^Live for nothing,/r$"); 102Console.WriteLine("r8 match count:" + r8.Matches(i).Count);//0 103Regex r9 = new Regex("^Live for nothing,/r$", RegexOptions.Multiline); 104Console.WriteLine("r9 match count:" + r9.Matches(i).Count);//1 105Regex r10 = new Regex("^die for something$"); 106Console.WriteLine("r10 match count:" + r10.Matches(i).Count);//0 107Regex r11 = new Regex("^die for something$", RegexOptions.Multiline); 108Console.WriteLine("r11 match count:" + r11.Matches(i).Count);//1 109Regex r12 = new Regex("^"); 110Console.WriteLine("r12 match count:" + r12.Matches(i).Count);//1 111Regex r13 = new Regex("$"); 112Console.WriteLine("r13 match count:" + r13.Matches(i).Count);//1 113Regex r14 = new Regex("^", RegexOptions.Multiline); 114Console.WriteLine("r14 match count:" + r14.Matches(i).Count);//2 115Regex r15 = new Regex("$", RegexOptions.Multiline); 116Console.WriteLine("r15 match count:" + r15.Matches(i).Count);//2 117Regex r16 = new Regex("^Live for nothing,/r$/n^die for something$", RegexOptions.Multiline); 118Console.WriteLine("r16 match count:" + r16.Matches(i).Count);//1 119//对于一个多行字符串,在设置了Multiline选项之后,^和$将出现多次匹配。 120 121string i = "Live for nothing,die for something"; 122string m = "Live for nothing,die for some thing"; 123Regex r1 = new Regex(@"/bthing/b"); 124Console.WriteLine("r1 match count:" + r1.Matches(i).Count);//0 125Regex r2 = new Regex(@"thing/b"); 126Console.WriteLine("r2 match count:" + r2.Matches(i).Count);//2 127Regex r3 = new Regex(@"/bthing/b"); 128Console.WriteLine("r3 match count:" + r3.Matches(m).Count);//1 129Regex r4 = new Regex(@"/bfor something/b"); 130Console.WriteLine("r4 match count:" + r4.Matches(i).Count);//1 131//b通常用于约束一个完整的单词 132 133 134 135(4)重复描述字符 136“重复描述字符”是体现C#正则表达式“很好很强大”的地方之一: 137{n} 匹配前面的字符n次 138{n,} 匹配前面的字符n次或多于n次 139{n,m} 匹配前面的字符n到m次 140? 匹配前面的字符0或1次 141+ 匹配前面的字符1次或多于1次 142* 匹配前面的字符0次或式于0次 143以下提供一些简单的示例: 144 145string x = "1024"; 146string y = "+1024"; 147string z = "1,024"; 148string a = "1"; 149string b="-1024"; 150string c = "10000"; 151Regex r = new Regex(@"^/+?[1-9],?/d{3}$"); 152Console.WriteLine("x match count:" + r.Matches(x).Count);//1 153Console.WriteLine("y match count:" + r.Matches(y).Count);//1 154Console.WriteLine("z match count:" + r.Matches(z).Count);//1 155Console.WriteLine("a match count:" + r.Matches(a).Count);//0 156Console.WriteLine("b match count:" + r.Matches(b).Count);//0 157Console.WriteLine("c match count:" + r.Matches(c).Count);//0 158//匹配1000到9999的整数。 159 160 161 162(5)择一匹配 163C#正则表达式中的 (|) 符号似乎没有一个专门的称谓,姑且称之为“择一匹配”吧。事实上,像[a-z]也是一种择一匹配,只不过它只能匹配单个字符,而(|)则提供了更大的范围,(ab|xy)表示匹配ab或匹配xy。注意“|”与“()”在此是一个整体。下面提供一些简单的示例: 164 165string x = "0"; 166string y = "0.23"; 167string z = "100"; 168string a = "100.01"; 169string b = "9.9"; 170string c = "99.9"; 171string d = "99."; 172string e = "00.1"; 173Regex r = new Regex(@"^/+?((100(.0+)*)|([1-9]?[0-9])(/./d+)*)$"); 174Console.WriteLine("x match count:" + r.Matches(x).Count);//1 175Console.WriteLine("y match count:" + r.Matches(y).Count);//1 176Console.WriteLine("z match count:" + r.Matches(z).Count);//1 177Console.WriteLine("a match count:" + r.Matches(a).Count);//0 178Console.WriteLine("b match count:" + r.Matches(b).Count);//1 179Console.WriteLine("c match count:" + r.Matches(c).Count);//1 180Console.WriteLine("d match count:" + r.Matches(d).Count);//0 181Console.WriteLine("e match count:" + r.Matches(e).Count);//0 182//匹配0到100的数。最外层的括号内包含两部分“(100(.0+)*)”,“([1-9]?[0-9])(/./d+)*”,这两部分是“OR”的关系,即正则表达式引擎会先尝试匹配100,如果失败,则尝试匹配后一个表达式(表示[0,100)范围中的数字)。 183 184 185 186(6)特殊字符的匹配 187下面提供一些简单的示例: 188 189string x = "//"; 190Regex r1 = new Regex("^////$"); 191Console.WriteLine("r1 match count:" + r1.Matches(x).Count);//1 192Regex r2 = new Regex(@"^//$"); 193Console.WriteLine("r2 match count:" + r2.Matches(x).Count);//1 194Regex r3 = new Regex("^//$"); 195Console.WriteLine("r3 match count:" + r3.Matches(x).Count);//0 196//匹配“/” 197 198string x = "/""; 199Regex r1 = new Regex("^/"$"); 200Console.WriteLine("r1 match count:" + r1.Matches(x).Count);//1 201Regex r2 = new Regex(@"^""$"); 202Console.WriteLine("r2 match count:" + r2.Matches(x).Count);//1 203//匹配双引号 204 205(7)组与非捕获组 206以下提供一些简单的示例: 207 208string x = "Live for nothing,die for something"; 209string y = "Live for nothing,die for somebody"; 210Regex r = new Regex(@"^Live ([a-z]{3}) no([a-z]{5}),die /1 some/2$"); 211Console.WriteLine("x match count:" + r.Matches(x).Count);//1 212Console.WriteLine("y match count:" + r.Matches(y).Count);//0 213//正则表达式引擎会记忆“()”中匹配到的内容,作为一个“组”,并且可以通过索引的方式进行引用。表达式中的“/1”,用于反向引用表达式中出现的第一个组,即粗体标识的第一个括号内容,“/2”则依此类推。 214 215string x = "Live for nothing,die for something"; 216Regex r = new Regex(@"^Live for no([a-z]{5}),die for some/1$"); 217if (r.IsMatch(x)) 218{ 219 Console.WriteLine("group1 value:" + r.Match(x).Groups[1].Value);//输出:thing 220} 221//获取组中的内容。注意,此处是Groups[1],因为Groups[0]是整个匹配的字符串,即整个变量x的内容。 222 223string x = "Live for nothing,die for something"; 224Regex r = new Regex(@"^Live for no(?<g1>[a-z]{5}),die for some/1$"); 225if (r.IsMatch(x)) 226{ 227 Console.WriteLine("group1 value:" + r.Match(x).Groups["g1"].Value);//输出:thing 228} 229//可根据组名进行索引。使用以下格式为标识一个组的名称(?<groupname>…)。 230 231string x = "Live for nothing nothing"; 232Regex r = new Regex(@"([a-z]+) /1"); 233if (r.IsMatch(x)) 234{ 235 x = r.Replace(x, "$1"); 236 Console.WriteLine("var x:" + x);//输出:Live for nothing 237} 238//删除原字符串中重复出现的“nothing”。在表达式之外,使用“$1”来引用第一个组,下面则是通过组名来引用: 239string x = "Live for nothing nothing"; 240Regex r = new Regex(@"(?<g1>[a-z]+) /1"); 241if (r.IsMatch(x)) 242{ 243 x = r.Replace(x, "${g1}"); 244 Console.WriteLine("var x:" + x);//输出:Live for nothing 245} 246 247string x = "Live for nothing"; 248Regex r = new Regex(@"^Live for no(?:[a-z]{5})$"); 249if (r.IsMatch(x)) 250{ 251 Console.WriteLine("group1 value:" + r.Match(x).Groups[1].Value);//输出:(空) 252} 253//在组前加上“?:”表示这是个“非捕获组”,即引擎将不保存该组的内容。 254 255(8)贪婪与非贪婪 256正则表达式的引擎是贪婪,只要模式允许,它将匹配尽可能多的字符。通过在“重复描述字符”(*,+)后面添加“?”,可以将匹配模式改成非贪婪。请看以下示例: 257 258string x = "Live for nothing,die for something"; 259Regex r1 = new Regex(@".*thing"); 260if (r1.IsMatch(x)) 261{ 262 Console.WriteLine("match:" + r1.Match(x).Value);//输出:Live for nothing,die for something 263} 264Regex r2 = new Regex(@".*?thing"); 265if (r2.IsMatch(x)) 266{ 267 Console.WriteLine("match:" + r2.Match(x).Value);//输出:Live for nothing 268} 269 270(9)回溯与非回溯 271使用“(?>…)”方式进行非回溯声明。由于正则表达式引擎的贪婪特性,导致它在某些情况下,将进行回溯以获得匹配,请看下面的示例: 272 273string x = "Live for nothing,die for something"; 274Regex r1 = new Regex(@".*thing,"); 275if (r1.IsMatch(x)) 276{ 277 Console.WriteLine("match:" + r1.Match(x).Value);//输出:Live for nothing, 278} 279Regex r2 = new Regex(@"(?>.*)thing,"); 280if (r2.IsMatch(x))//不匹配 281{ 282 Console.WriteLine("match:" + r2.Match(x).Value); 283} 284//在r1中,“.*”由于其贪婪特性,将一直匹配到字符串的最后,随后匹配“thing”,但在匹配“,”时失败,此时引擎将回溯,并在“thing,”处匹配成功。 285//在r2中,由于强制非回溯,所以整个表达式匹配失败。 286 287(10)正向预搜索、反向预搜索 288正向预搜索声明格式:正声明 “(?=…)”,负声明 “(?!...)” ,声明本身不作为最终匹配结果的一部分,请看下面的示例: 289 290string x = "1024 used 2048 free"; 291Regex r1 = new Regex(@"/d{4}(?= used)"); 292if (r1.Matches(x).Count==1) 293{ 294 Console.WriteLine("r1 match:" + r1.Match(x).Value);//输出:1024 295} 296Regex r2 = new Regex(@"/d{4}(?! used)"); 297if (r2.Matches(x).Count==1) 298{ 299 Console.WriteLine("r2 match:" + r2.Match(x).Value); //输出:2048 300} 301//r1中的正声明表示必须保证在四位数字的后面必须紧跟着“ used”,r2中的负声明表示四位数字之后不能跟有“ used”。 302 303string x = "used:1024 free:2048"; 304Regex r1 = new Regex(@"(?<=used:)/d{4}"); 305if (r1.Matches(x).Count==1) 306{ 307 Console.WriteLine("r1 match:" + r1.Match(x).Value);//输出:1024 308} 309Regex r2 = new Regex(@"(?<!used:)/d{4}"); 310if (r2.Matches(x).Count==1) 311{ 312 Console.WriteLine("r2 match:" + r2.Match(x).Value);//输出:2048 313} 314//r1中的反向正声明表示在4位数字之前必须紧跟着“used:”,r2中的反向负声明表示在4位数字之前必须紧跟着除“used:”之外的字符串。 315 316 317 318(11)十六进制字符范围 319正则表达式中,可以使用 "/xXX" 和 "/uXXXX" 表示一个字符("X" 表示一个十六进制数)形式字符范围: 320/xXX 编号在 0到255 范围的字符,比如:空格可以使用 "/x20" 表示。 321/uXXXX 任何字符可以使用 "/u" 再加上其编号的4位十六进制数表示,比如:汉字可以使用“[/u4e00-/u9fa5]”表示。 322 323 324(12)对[0,100]的比较完备的匹配 325下面是一个比较综合的示例,对于匹配[0,100],需要特殊考虑的地方包括 326*00合法,00.合法,00.00合法,001.100合法 327*空字符串不合法,仅小数点不合法,大于100不合法 328*数值是可带后缀的,如“1.07f”表示该值为一个float类型(未考虑) 329 330Regex r = new Regex(@"^/+?0*(?:100(/.0*)?|(/d{0,2}(?=/./d)|/d{1,2}(?=($|/.$)))(/./d*)?)$"); 331string x = ""; 332while (true) 333{ 334 x = Console.ReadLine(); 335 if (x != "exit") 336 { 337 if (r.IsMatch(x)) 338 { 339 Console.WriteLine(x + " succeed!"); 340 } 341 else 342 { 343 Console.WriteLine(x + " failed!"); 344 } 345 } 346 else 347 { 348 break; 349 } 350} 351 352(13)精确匹配有时候是困难的 353有些需求要做到精确匹配比较困难,例如:日期、Url、Email地址等,其中一些你甚至需要研究一些专门的文档写出精确完备的表达式,对于这种情况,只能退而求其次,保证比较精确的匹配。例如对于日期,可以基于应用系统的实际情况考虑一段较短的时间,或者对于像Email的匹配,可以只考虑最常见的形式。
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang