2015.3.12Arinc424 Tools中SiniArincCls.csParserFile(string sFile)函数正则表达式理解

原文:

string RegEx1 = @"(\[ITEM\]\s*=[\S\s]*?(?=\[ITEM\])|\[ITEM\]\s*=[\S\s]*)";//用来识别主记录和后续记录,并完成分组

解释

1.该表达式首尾的()没具体含义,可以去掉(不完全是,见后面解释)

2.该表达式是一个2重选择结构,以|分开

3. 第1部分:\[ITEM\]\s*=[\S\s]*?(?=\[ITEM\]) 最后有个(?=)结构,表示零宽前向断言,该句中表示截止到[ITEM]开始位置;[\S\s]*结构表示任何字符可以出现不限次,加上?表示懒惰模式,匹配最短的任何字符,结果就一个多余字符也不匹配了,只匹配[ITEM\] =

4.第2部分\[ITEM\]\s*=[\S\s]*与第一部分开头一样,表示或者匹配'[ITEM\]='开始的任何部分,注意*号后面没有?表示=后可以跟无限多字符直到结束

整条语句的含义是以'[ITEM]='分割匹配,前面各次匹配'[ITEM]=XXXXXX'[ITEM]''结构(不包括结尾的[ITEM]),最后一次匹配'[ITEM]='结构

 

Regex reg = new Regex(@"[\w\W]*\n");

string input = @"3

4

5";

Match mc1 = reg.Match(input); 这样匹配出的结果只有一条 3\r\n4\r\n

如果将条件改为Regex reg = new Regex(@"[\w\W]*?\n"); //*后面加一个?表示懒惰模式,尽量少地匹配

匹配结果会有两条'3\r\n'和'4\r\n'

加深对*?懒惰模式的理解不加?表示贪婪模式,尽量多地匹配即使已经满足条件了3后面\n仍然往后寻找,直到最大程度满足条件。而懒惰模式只要一满足条件立即终止寻找。而且贪婪模式并不局限于一个*所有该范围内的*都将采用懒惰模式

 

Regex reg = new Regex(@"[123]b");

string input = @"321ba4b5";

此时匹配结果是1b,跟想象一样但

如果将条件改为"[123]*b" 则结果为321b。跟想象中不一样

这说明[]*的*可以取[]中的任何字符来重复,而不局限于某个字符重复

 

(?<==)[\w\W]*?(?=\r\n) 一个=的后向定位加一个\r\n的前向定位 表示=和回车之间的字符,不包括=或回车

 

()在分组的作用

Regex reg = new Regex(@"(1)(2)(3)"); 和Regex reg = new Regex(@"123"); 的区别

string input = @"a123b";

Match mc1 = reg.Match(input);

string res = mc1.ToString();

上述两种写法反应在res上都一样都是123

但是mc1.Groups.count不一样

前者数量为4,后者为1

前者4个Group取值分别为 123,1,2,3

后者1个Group取值为123

说明在匹配条件中加()可以对匹配结果进行分组

而Regex reg = new Regex(@"(123)");

Group结果为2,两个Group取值一样都是123

Regex reg = new Regex(@"(1)2(3)");

Group结果为3,分别是123,1,3

说明分组的数量是()对数量+1

 

//一句话实现字符串过滤数字或非数字

string ts = "sdf33sdf43sdf334";

string sz=new Regex("[^0-9]").Replace(ts,""); //只保留数字

string zm=new Regex("[0-9]").Replace(ts,""); //只保留非数字

 

string wei = new Regex(@"^\d{6}.*\d*N").Match("321564N1254784.34E").ToString();

string jin = new Regex(@"N\d{7}.*\d*E$").Match("321564N1254783.34E").ToString();

 

转载于:https://www.cnblogs.com/mol1995/p/5964864.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值