原文:
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();