一次Regex磨難

來源:互聯網
上載者:User

在項目中要對如下資料(字串)進行解析:
[6666666]<NewDataSet>
<Table>
  <T1>adf</T1>
  <T2>asdf</T2>
</Table>
</NewDataSet>

將其中的666666單獨抓出來存放為記錄數
將<NewDataSet>
<Table>
  <T1>adf</T1>
  <T2>asdf</T2>
</Table>
</NewDataSet>抓出來存放到另一個字串中。

上述的要求,用Regex當然是最好的了(當然,也可以用string的一些方法進行判斷)
好長時間不接觸Regex,很生疏,都得按著一些教程之類的慢慢做。
中間經曆了不少的磨難,比如
.號,匹配除了分行符號外的其它字元,而我這個字串中恰好有不少分行符號。
經查,在模式前加上 (?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] 是不是覺得有點難區分呢?  只要記得元字元是小寫,反義字元是大寫就可以了。

 總結:這其實算不上磨難,因為--基礎不牢。這算是懲罰。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.