现在的位置: 首页 > 综合 > 正文

一次正则表达式磨难

2012年01月07日 ⁄ 综合 ⁄ 共 963字 ⁄ 字号 评论关闭

在项目中要对如下数据(字符串)进行解析:
[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;

之间随便温习了一下后向引用的东东。
\num  后向引用组编号的匹配
\k<word> 后向引用组命名的匹配
当然,分组是基本的:
\?<组编号>  |  \?<组命名>

(?<1>\d)  或 (?<num>\d)
如果不需要将括号内的匹配编入组,只需要更改为(?:\d+).

值得我们记得的几个元字符:

. 匹配除换行符以外的任意字符(如果要匹配换行符,就在前加(?s))
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

与它们对应的还有反义字符

\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 是不是觉得有点难区分呢?  只要记得元字符是小写,反义字符是大写就可以了。

 总结:这其实算不上磨难,因为--基础不牢。这算是惩罚。

抱歉!评论已关闭.