使用正規表示式模擬讀寫INI檔案

2021-08-03 20:26:24 字數 3112 閱讀 1152

#include "stdio.h"

#include

#include

#include

#include

using

namespace

std;

void trim(char * str);

void ltrim(char * str);

void rtrim(char * str);

// 測試sscanf 和 正規表示式

// sscanf提供的這個擴充套件功能其實並不能真正稱為正規表示式,因為他的書寫還是離不開%

// 表示字元範圍,{}表示重複次數,^表示取非,*表示跳過。所以上面這個url的解析可以寫成下面這個樣子:

////char url = "dv:"

////sscanf(url, "%[^://]%*c%*c%*c%[^:]%*c%d%*c%d%*c%d", protocol, ip, port, chn, type);

////解釋一下

//先取得乙個最長的字串,但不包括字串 ://,於是protocol="dv\0";

//然後跳過三個字元,(%*c)其實就是跳過 ://

// 接著取乙個字串不包括字串 : ,於是ip = 192.168.1.253,這裡簡化處理了,ip就當個字串來弄,而且不做檢查

// 然後跳過冒號取埠到port,再跳過 / 取信道號到chn,再跳過 / 取碼流型別到type。

// c語言實現上例

void test1()

// 讀取ini裡某行字串, 得到: hello world!

// 正常串1: -claim="hello world!"

// 正常串2: claim = "hello world!"

// 正常串3: claim = " hello world!"

// 正常串4: claim_ = hello world!

// 正常串5: claim = "hello world!"

// 正常串6: claim = "hello world!"

// 正常串7: claim =

// 干擾串1: cl-aim = \"hello world!"

// 干擾串2: clai3m = "hello world!\"

// 干擾串3: cla_im = \\"hello world!\"

// 干擾串4: claim ='"hello world!\"

// 干擾串5: claim= @"\nhello world!"

// 干擾串6: claim=l"hello world!"

// 未處理1: claim[1] = 1

// 未處理1: claim[2] = 1

void test2()

; char val[1000] = ;

char key[1000] = ;

file *fp = fopen("1.txt", "r");

if (null == fp)

while (!feof(fp))

printf("\n");

fclose(fp);

}// 上例的c++實現

template

inline t1 parseto(const t2 t)

string trim(string& s)

}for (int i = s.size() - 1; i > -1; i--)

}return s;

}void test3()

; char key[1000] = ;

ifstream fin("1.txt");

string line;

if (fin)

"<< endl;

/// 提取等號之後的內容

// 第1組()表示任意個空格字元,第2組()表示單詞(可帶_或-),

// 第3組()表示1個以上的空格字元(或=),第4組()表示任意個字元除換行符外,

// 第5組()表示以任意個空格字元(或回車換行符)結尾。

reg = regex("^([\\s]*)([\\w\\-\\_]+)([\\s=]+)(.*)([\\s]*)$");

// 取第4組代替原串

string val = trim(regex_replace(line, reg, "$4"));

cout

<< " val: "

<< endl;

// 去除兩邊雙引號

// ...

// 插入map

// map[key]=value;

// string 轉 其它型別

// int i = parseto("123");

// float f = parseto("1.23");

// string str = parseto(123);}}

else

// 沒有該檔案

}void main()

void ltrim(char * str)

memmove(str, str + i, len - i + 1);

return;

}void rtrim(char * str)

str[i + 1] = 0;

return;

}void trim(char * str)

memmove(str, str + i, len - i + 1);

//再去除右邊的空格

正規表示式 火星文

之前在學習到正規表示式的時候,真的看了兩秒直接就跳過了,真的看到都怕,來自地球的我表示真的看不懂這個傳說中的火星文,但是,要想學習到更多的知識,我深知逃避是解決不了問題的,於是我硬著頭皮嘗試的去理解它,今天簡單記錄下來,以供以後來鄙視 正則表達是其實就是規則表示式,就是我們要找的條件翻譯成計算機能讀...

使用正規表示式

如果原來沒有使用過正規表示式,那麼可能對這個術語和概念會不太熟悉。不過,它們並不是您想象的那麼新奇。請回想一下在硬碟上是如何查詢檔案的。您肯定會使用 和 字元來幫助查詢您正尋找的檔案。字元匹配檔名中的單個字元,而 則匹配乙個或多個字元。乙個如 data?dat 的模式可以找到下述檔案 data1.d...

使用正規表示式

本文節選自 並有稍微修正。使用正規表示式 您可以使用正規表示式做很多事情。在以下的列表中,您可以找到一些最普通 最常用的正規表示式的例子。表示文字串必須在一行的開頭。所以,當查詢行的開頭只為 hosts 的行,可以使用命令 grep ls hosts 代表了一行的結尾。所以,當查詢行的結尾只為 ho...