一次正则表达式磨难
在项目中要对如下数据(字符串)进行解析:
[6666666]<NewDataSet>
<Table>
<T1>adf</T1>
<T2>asdf</T2>
</Table>
</NewDataSet>
将其中的666666单独抓出来存放为记录数
将<NewDataSet>
<Table>
<T1>adf</T1>
<T2>asdf</T2>
</Table>
</NewDataSet>抓出来存放到另一个字符串中。
上述的要求,用正则表达式当然是最好的了(当然,也可以用string的一些方法进行判断)
好长时间不接触正则表达式,很生疏,都得按着一些教程之类的慢慢做。
中间经历了不少的磨难,比如
.号,匹配除了换行符外的其它字符,而我这个字符串中恰好有不少换行符。
经查,在模式前加上 (?s)(?i)就可以实现.号匹配换行符了,其中(?s)是让.号匹配换行 符,(?i)是进行不区分大小写的匹配
最后的表达式如下:
1Match match=Regex.Match(strXML,@"(?s)(?i)(?:\[)(?<record>\d+)(?:\])(?<xml>.*)");
2pageCount=Int32.Parse(match.Groups["record"].Value);
3strXML=match.Groups["xml"].Value;
2pageCount=Int32.Parse(match.Groups["record"].Value);
3strXML=match.Groups["xml"].Value;
之间随便温习了一下后向引用的东东。
\num 后向引用组编号的匹配
\k<word> 后向引用组命名的匹配
当然,分组是基本的:
\?<组编号> | \?<组命名>
如
(?<1>\d) 或 (?<num>\d)
如果不需要将括号内的匹配编入组,只需要更改为(?:\d+).
值得我们记得的几个元字符:
. | 匹配除换行符以外的任意字符(如果要匹配换行符,就在前加(?s)) |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 是不是觉得有点难区分呢? 只要记得元字符是小写,反义字符是大写就可以了。 |
总结:这其实算不上磨难,因为--基础不牢。这算是惩罚。
<h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>