File tree Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Original file line number Diff line number Diff line change
1
+ ======================================================
2
+ callout.c の結果と考察 no.017 2022/11/30
3
+ ======================================================
4
+
5
+ ## line: 256
6
+ test(enc, mp, "(?:(*MAX[T]{3})a)*(?:(*MAX{T})c)*", "aaccc");
7
+
8
+
9
+ この1行による出力が以下のもの
10
+
11
+ --------------------------
12
+ match at 0
13
+ 0: (0-4)
14
+ --------------------------
15
+
16
+
17
+ 1. この正規表現の縮図
18
+
19
+ "aaccc" =~ /(?:a)*(?:c)*/
20
+
21
+
22
+
23
+ 2. (*MAX{T})
24
+
25
+ 上限のマッチ回数を指定する { } の中身が (*MAX[T]{3}) のタグ名である "T" になっている。
26
+ (*MAX{T}) が試されると、 その時点での (*MAX[T]{3}) のマッチ回数が参照され、 その数字が
27
+ (*MAX{T}) の上限として設定される。
28
+
29
+
30
+ 検索対象文字列は "aaccc" なので、 まず "a" が2個マッチする。
31
+ これにより (*MAX[T]{3}) のマッチ回数は "2" となり、 (*MAX{T}) は (*MAX{2}) として動作することになる。
32
+
33
+ "ccc" に対し (?:c)* が試され、 上限が "2" なので "cc" までのマッチとなる。
34
+ 全体マッチは 0 の位置から 4 の位置までとなる。
35
+
36
+
37
+
38
+
39
+ 3. 検索対象文字列を "aaccc" から "ccc" に書き換えてテスト
40
+
41
+
42
+ test(enc, mp, "(?:(*MAX[T]{3})a)*(?:(*MAX{T})c)*", "ccc");
43
+
44
+ 結果
45
+ --------------------------
46
+ match at 0
47
+ 0: (0-0)
48
+ --------------------------
49
+
50
+ "a" に1回もマッチ出来ないため (*MAX[T]{3}) のマッチ回数は "0" となり、 (*MAX{T}) の上限も "0" となる。
51
+ ゆえに1回もマッチすることが許されなくなり、 "*" による繰り返しは "0" 回のマッチに成功する。
52
+
53
+ 全体としてのマッチは 0 の位置から 0 の位置まで、 すなわち空文字列 "" にマッチする。
54
+
55
+
56
+
57
+
58
+ おわり
59
+
60
+
61
+
You can’t perform that action at this time.
0 commit comments