首先,我們需要定義只會找「只有數字」的文字串,這利用正規表達式很好做
\d 代表數字,也就是所有的數字字符 0~9
然而,有些數字會由有兩個以上的數字字符串接,因此
\d+ 代表所有連續出現「1~無限次數」的數字字符
再來,我們需要檢查前後有沒有雜七雜八的怪東西,因此可以利用向前查看(lookahead)及向後查看(lookbehind)斷言(assertion):
(?<=^| ): 只要是在行首,或是前方有空格,就匹配
^ 表示字串頭,只要不是在最前面,就不匹配
| 表示選擇,只要左或右有一種符合就匹配
" " 表示空格,只要前面是空格,就匹配
(?=$| ): 只要是在行尾,或是後方有空格,就匹配
$ 表示字串尾,只要不是在最後面,就不匹配
值得注意的是,C++的Regex是採用ECMAScript’s (ECMA-262),所以無法使用向後查看(?<=^| ),可用(^| )做代替,不過後面寫法會有不同。
接下來只要一直循環地進行尋找第一個匹配、相加和刪除第一個匹配,即可AC。
再來說C++的處理方式:
我們需要用到「捕獲組(Capturing group)」,只要你的表達式,是以括號"("、")"包起來,且第一個字元不是"?",就會被捕獲,因此你的regex應該會長這樣:
(^| )(\d+)(?=$| )
附註:在c++字串中,由於需要跳脫"\",所以會變成"\\d"
其中,第一捕獲組:(^| )捕獲前方的空格或行首字串,是我們不需要的
但第二捕獲組:(\d+)捕獲的就是我們要的數字
接下來利用regex_search()函數,去尋找第一個匹配的字串,並取其第二捕獲組即可,語法如下:string str = "11 11{ 11} 5. 6";
smatch mat;regex re("(^| )(\\d+)(?=$| )");
regex_search(str, mat, re);
int num = mat[2];//儲存著第二個「捕獲組」int all = mat[0];//儲存著第一個「匹配的整個字串」,非第一捕獲組