在項目中要對如下資料(字串)進行解析:
[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] |
是不是覺得有點難區分呢? 只要記得元字元是小寫,反義字元是大寫就可以了。 |
總結:這其實算不上磨難,因為--基礎不牢。這算是懲罰。