• 一次正则表达式磨难


    在项目中要对如下数据(字符串)进行解析:
    [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] 是不是觉得有点难区分呢?  只要记得元字符是小写,反义字符是大写就可以了。

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

  • 相关阅读:
    Python 实践
    Keras实践
    NLP S实践
    Spark java 实践
    Seaborn数据探索可视化
    Linux实践
    Redis
    ML算法选型
    Elasticsearch issue
    牛客练习赛37
  • 原文地址:https://www.cnblogs.com/McJeremy/p/1350053.html
Copyright © 2020-2023  润新知