#37836: 試著利用正規表達式(Regular Expression)解題,C++/Python/其他不確定但應該可以


990293kwi@gmail.com (翔越風)

學校 : 國立臺灣海洋大學
編號 : 124054
來源 : [1.200.76.129]
最後登入時間 :
2024-02-10 22:36:17
d098. Stringstream運用練習(C++) -- 說明文件出自C++ Reference | From: [1.169.88.17] | 發表日期 : 2023-10-12 18:36

首先,我們需要定義只會找「只有數字」的文字串,這利用正規表達式很好做

\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];//儲存著第一個「匹配的整個字串」,非第一捕獲組

取代時使用:
str = regex_replace(str, regex (re), "", regex_constants::format_first_only);
即可

 
ZeroJudge Forum