sscanf正則表達式用法簡介


簡介

其實sscanf 中的篩選條件並不是嚴格意義上的正則表達式,只能說是正則表達式的簡化版本,直接套用正則表達式可能出錯。比如:

  1. 正則表達式中星號*、問號?、加號+、{n,m}分別表示匹配≥0、1個、≥1、n~m個字符,而sscanf中默認匹配任意多個滿足條件的字符,直到遇到不滿足條件的字符(即相當於默認只有正則表達式星號* 號的功能),不可再使用星號*、問號?、加號+、{n,m}

  2. sscanf篩選條件中需要規定匹配字符個數時,應在%或%*后面加上相應數字

用法示例

/*提取字符串括號里的字符*/
#include<cstdio>
#include<cstring>
int main(){
   char str[256];
   sscanf("First (helloWorld): last","%*[^(](%[^)]%*[^\n]",str);
   printf("$%s$\n",str); //輸出$helloWorld$
   sscanf("First (helloWorld): last","%*[^(](%5[^)]%*[^\n]",str); //限定5個字符
   printf("$%s$\n",str); //輸出$hello$
   return 0;
}
/*
   %*[^(]  	連續匹配非左括號字符First 並丟棄之,遇到左括號停止
   ( 		匹配並丟棄左括號
   %[^)]  	連續匹配非右括號字符helloWorld(遇到右括號停止)並賦值給str
   %*[^\n] 	連續匹配非換行符的字符,遇到換行符停止(不接收換行符),這部分可省略,不影響結果
   %5[^)]  	限定只匹配5個字符
*/

符號說明

  1. % 代表選擇,后跟相應條件
  2. %* 代表過濾(即連續匹配滿足條件的字符,並丟棄)
  3. %%* 后面緊跟的數字代表匹配的字符個數
  4. %5[^)]代表匹配5個非)的字符,[]內是篩選的條件,^表示否定,如%[a-z]表示接收小寫字母,%[A-Z0-9] 表示接收大寫字母及數字
  5. 要匹配中間的字符時,應先將前面的字符用%*過濾掉

拓展

1. 提取子串

// 讀取行,並提取第一個括號里的子串
#include <stdio.h>

int main() {
  char line[256], str[128];

  while (fgets(line, sizeof line, stdin)) {
    sscanf(line, "%*[^(](%127[^)]", str);
    printf("|%s|\n", str);
  }

  return 0;
}

運行樣例:

one (two) three
|two|
four (five) six
|five|
seven eight (nine) ten
|nine|

2. 字符串在printfscanf中的使用

  • printf("%5.3s",str+2);表示從str[2]開始輸出字符串的至多3個字符,輸出不足5位則在左側用空格補足
  • scanf("%3s",str); 從輸入流中提取3個字符賦給str

參考資料:https://stackoverflow.com/a/24483494/12634621


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM