ホームページ ウェブフロントエンド jsチュートリアル INI ファイルを読み取るための正規表現シミュレーションの手順の詳細な説明

INI ファイルを読み取るための正規表現シミュレーションの手順の詳細な説明

Mar 29, 2018 pm 01:55 PM
書類 詳しい説明 読む

这次给大家带来正则模拟读取INI文件的步奏详解,使用正则模拟读取INI文件的注意事项有哪些,下面就是实战案例,一起来看一下。

废话不多说了,直接给大家贴代码了,具体代码如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

#include "stdio.h" 

#include <sstream> 

#include <iostream> 

#include <fstream> 

#include <regex> 

using namespace std; 

void Trim(char * str); 

void lTrim(char * str); 

void rTrim(char * str); 

// 测试sscanf 和 正则表达式 

// sscanf提供的这个扩展功能其实并不能真正称为正则表达式,因为他的书写还是离不开% 

// []表示字符范围,{}表示重复次数,^表示取非,*表示跳过。所以上面这个url的解析可以写成下面这个样子: 

// 

//char url[] = "dv://192.168.1.253:65001/1/1" 

// 

//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() 

 char url[] = "dv://192.168.1.253:65001/1/1"

 char protocol[10]; 

 char ip[17]; 

 int port; 

 int chn; 

 int type; 

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

 printf("%s, %s, %d, %d, %d\n", protocol, ip, port, chn, type); 

// 读取ini里某行字符串, 得到: hello world! 

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

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

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

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

// 干扰串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 line[1000] = { 0 }; 

 char val[1000] = { 0 }; 

 char key[1000] = { 0 }; 

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

 if (NULL == fp) 

 

  printf("failed to open 1.txt\n"); 

  return 

 

 while (!feof(fp)) 

 

  memset(line, 0, sizeof(line)); 

  fgets(line, sizeof(line) - 1, fp); // 包含了每行的\n 

  printf("%s", line); 

  Trim(line); 

  // 提取等号之前的内容 

  memset(key, 0, sizeof(key)); 

  // sscanf使用的format不是正则表达式,不能用 \\s 表示各种空白符,即空格或\t,\n,\r,\f 

  sscanf(line, "%[^ \t\n\r\f=]", key); 

  //sscanf(line, "%*[^a-zA-Z0-9_-]%[^ \t\n\r\f=]", key); 

  printf(" key: [%s]\n", key); 

  // 提取等号之后的内容 

  memset(val, 0, sizeof(val)); 

  sscanf(line, "%*[^=]%*c%[^\n]", val); // 不包含了每行的换行符 

  Trim(val); 

  printf(" val: [%s]\n", val); 

  // 去除两边双引号 

  // ... 

  // 插入map 

  // map[key]=value; 

  // string 转 其它类型 

  // atoi, atol, atof 

 

 printf("\n"); 

 fclose(fp); 

// 上例的C++实现 

template<class T1, class T2> 

inline T1 parseTo(const T2 t) 

 static stringstream sstream; 

 T1 r; 

 sstream << t;

 sstream >> r; 

 sstream.clear(); 

 return r; 

void test3() 

 char val[1000] = { 0 }; 

 char key[1000] = { 0 }; 

 ifstream fin("1.txt"); 

 string line; 

 if (fin) 

 

  while (getline(fin, line)) // line中不包括每行的换行符 

  

   cout << line << endl;

   /// 提取等号之前的内容

   // 第1组()表示任意个空格字符,第2组()表示单词(可带_或-),

   // 第3组()表示1个以上的空格字符(或=),最后以任意字符串结尾

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

   // 取第2组代替原串

   string key = regex_replace(line, reg, "$2");

   cout << " key: {" << key << "}" << endl;

   /// 提取等号之后的内容

   // 第1组()表示任意个空格字符,第2组()表示单词(可带_或-),

   // 第3组()表示1个以上的空格字符(或=),第4组()表示任意个字符,

   // 第5组()表示以任意个空格字符(或回车换行符)结尾。

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

   // 取第4组代替原串

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

   cout << " val: {" << val << "}" << endl;

   // 去除两边双引号

   // ...

   // 插入map

   // map[key]=value;

   // string 转 其它类型

   // int i = parseTo<int>("123"); 

   // float f = parseTo<float>("1.23"); 

   // string str = parseTo<string>(123); 

  

 

 else // 没有该文件 

 

  cout << "no such file" << endl;

 }

}

void main()

{

 //test1();

 test2();

 test3();

}

void lTrim(char * str)

{

 int i, len;

 len = strlen(str);

 for (i = 0; i<len; i++)

 {

  if (str[i] != &#39; &#39; && str[i] != &#39;\t&#39; && str[i] != &#39;\n&#39; && str[i] != &#39;\r&#39; && str[i] != &#39;\f&#39;) break;

 }

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

 return;

}

void rTrim(char * str)

{

 int i, len;

 len = strlen(str);

 for (i = len - 1; i >= 0; i--) 

 

  if ((str[i] != ' ') && (str[i] != 0x0a) && (str[i] != 0x0d) && (str[i] != '\t') && (str[i] != '\f')) break

 

 str[i + 1] = 0; 

 return

void Trim(char * str) 

 int i, len; 

 //先去除左边的空格 

 len = strlen(str); 

 for (i = 0; i<len; i++)

 {

  if (str[i] != &#39; &#39; && str[i] != &#39;\t&#39; && str[i] != &#39;\n&#39; && str[i] != &#39;\r&#39; && str[i] != &#39;\f&#39;) break;

 }

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

 //再去除右边的空格

 len = strlen(str);

 for (i = len - 1; i >= 0; i--) 

 

  if (str[i] != ' ' && str[i] != '\t' && str[i] != '\n' && str[i] != '\r' && str[i] != '\f'break

 

 str[i + 1] = 0; 

 return

/* 

void Trim(char * str) 

 lTrim(str); 

 rTrim(str); 

*/

ログイン後にコピー

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Linux grep与正则表达式的使用

正则表达式匹配URL、电话、手机、邮箱的方法

以上がINI ファイルを読み取るための正規表現シミュレーションの手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

0x80004005 エラー コードが表示された場合の対処方法 エディターは、0x80004005 エラー コードを解決する方法を説明します。 0x80004005 エラー コードが表示された場合の対処方法 エディターは、0x80004005 エラー コードを解決する方法を説明します。 Mar 21, 2024 pm 09:17 PM

パソコン上のフォルダーを削除または解凍するときに、「エラー 0x80004005: 不明なエラー」というダイアログ ボックスが表示されることがあります。この状況はどう解決すればよいでしょうか?エラー コード 0x80004005 が表示される理由は実際にはたくさんありますが、そのほとんどはウイルスによって引き起こされます。DLL を再登録して問題を解決できます。以下では、エディターがエラー コード 0x80004005 の処理体験を説明します。 。一部のユーザーは、コンピュータの使用時にエラー コード 0X80004005 を表示されます。0x80004005 エラーは主に、コンピュータが特定のダイナミック リンク ライブラリ ファイルを正しく登録していないこと、またはファイアウォールがコンピュータとインターネット間の HTTPS 接続を許可していないことが原因で発生します。それでどうですか

Quark Cloud Disk から Baidu Cloud Disk にファイルを転送するにはどうすればよいですか? Quark Cloud Disk から Baidu Cloud Disk にファイルを転送するにはどうすればよいですか? Mar 14, 2024 pm 02:07 PM

Quark Netdisk と Baidu Netdisk は現在、ファイルの保存に最も一般的に使用されている Netdisk ソフトウェアです。Quark Netdisk 内のファイルを Baidu Netdisk に保存したい場合は、どうすればよいですか?今回は、Quark Network Disk コンピュータから Baidu Network Disk にファイルを転送するためのチュートリアル手順を編集者がまとめたので、その操作方法を見てみましょう。 QuarkネットワークディスクファイルをBaiduネットワークディスクに保存するにはどうすればよいですか? Quark Network Disk から Baidu Network Disk にファイルを転送するには、まず Quark Network Disk から必要なファイルをダウンロードし、次に Baidu Network Disk クライアントでターゲット フォルダーを選択して開きます。次に、Quark Cloud Disk からダウンロードしたファイルを Baidu Cloud Disk クライアントによって開かれたフォルダーにドラッグ アンド ドロップするか、アップロード機能を使用してファイルを Baidu Cloud Disk に追加します。アップロードが完了したら、Baidu Cloud Disk にファイルが正常に転送されたかどうかを必ず確認してください。それでおしまい

hiberfil.sys ファイルとは何ですか? hiberfil.sysは削除できますか? hiberfil.sys ファイルとは何ですか? hiberfil.sysは削除できますか? Mar 15, 2024 am 09:49 AM

最近、多くのネチズンが編集者に「hiberfil.sys ファイルとは何ですか?」と尋ねました。 hiberfil.sys は C ドライブのスペースを多く消費し、削除される可能性がありますか?エディターは、hiberfil.sys ファイルを削除できることを通知します。以下で詳細を見てみましょう。 hiberfil.sys は Windows システムの隠しファイルであり、システム休止状態ファイルでもあります。通常、C ドライブのルート ディレクトリに保存され、そのサイズはシステムに搭載されているメモリのサイズと同等です。このファイルはコンピュータが休止状態になっているときに使用され、リカバリ中に以前の状態にすばやく復元できるように、現在のシステムのメモリ データが含まれています。そのサイズはメモリ容量と等しいため、より多くのハードドライブスペースを占有する可能性があります。冬休み

ファイルパスでのスラッシュとバックスラッシュのさまざまな使用法 ファイルパスでのスラッシュとバックスラッシュのさまざまな使用法 Feb 26, 2024 pm 04:36 PM

ファイル パスは、ファイルまたはフォルダーを識別して検索するためにオペレーティング システムによって使用される文字列です。ファイル パスには、パスを区切る 2 つの一般的な記号、つまりスラッシュ (/) とバックスラッシュ () があります。これら 2 つのシンボルは、オペレーティング システムごとに異なる用途と意味を持ちます。スラッシュ (/) は、Unix および Linux システムで一般的に使用されるパス区切り文字です。これらのシステムでは、ファイル パスはルート ディレクトリ (/) から始まり、各ディレクトリ間はスラッシュで区切られます。たとえば、パス /home/user/Document

Win11での管理者権限の取得について詳しく解説 Win11での管理者権限の取得について詳しく解説 Mar 08, 2024 pm 03:06 PM

Windows オペレーティング システムは世界で最も人気のあるオペレーティング システムの 1 つであり、その新バージョン Win11 が大きな注目を集めています。 Win11 システムでは、管理者権限の取得は重要な操作であり、管理者権限を取得すると、ユーザーはシステム上でより多くの操作や設定を実行できるようになります。この記事では、Win11システムで管理者権限を取得する方法と、権限を効果的に管理する方法を詳しく紹介します。 Win11 システムでは、管理者権限はローカル管理者とドメイン管理者の 2 種類に分かれています。ローカル管理者はローカル コンピュータに対する完全な管理権限を持っています

Oracle SQLの除算演算の詳細説明 Oracle SQLの除算演算の詳細説明 Mar 10, 2024 am 09:51 AM

OracleSQL の除算演算の詳細な説明 OracleSQL では、除算演算は一般的かつ重要な数学演算であり、2 つの数値を除算した結果を計算するために使用されます。除算はデータベース問合せでよく使用されるため、OracleSQL での除算演算とその使用法を理解することは、データベース開発者にとって重要なスキルの 1 つです。この記事では、OracleSQL の除算演算に関する関連知識を詳細に説明し、読者の参考となる具体的なコード例を示します。 1. OracleSQL での除算演算

MySQLにおける.ibdファイルの役割と注意事項について詳しく解説 MySQLにおける.ibdファイルの役割と注意事項について詳しく解説 Mar 15, 2024 am 08:00 AM

MySQL における .ibd ファイルの役割とそれに関連する注意事項の詳細な説明 MySQL は人気のあるリレーショナル データベース管理システムであり、データベース内のデータは別のファイルに保存されます。このうち、.ibd ファイルは InnoDB ストレージ エンジンのデータ ファイルであり、データとインデックスをテーブルに保存するために使用されます。この記事では、MySQL における .ibd ファイルの役割を詳細に分析し、読者の理解を深めるために関連するコード例を示します。 1. .ibd ファイルの役割: データの保存: .ibd ファイルは InnoDB ストレージです

PHPモジュロ演算子の役割と使い方を詳しく解説 PHPモジュロ演算子の役割と使い方を詳しく解説 Mar 19, 2024 pm 04:33 PM

PHP のモジュロ演算子 (%) は、2 つの数値を除算した余りを取得するために使用されます。この記事では、モジュロ演算子の役割と使用法について詳しく説明し、読者の理解を深めるために具体的なコード例を示します。 1. モジュロ演算子の役割 数学では、整数を別の整数で割ると、商と余りが得られます。たとえば、10 を 3 で割ると、商は 3 になり、余りは 1 になります。モジュロ演算子は、この剰余を取得するために使用されます。 2. モジュロ演算子の使用法 PHP では、% 記号を使用してモジュロを表します。

See all articles