Skip to content

Commit e3fa2e2

Browse files
(?:(*MAX[T]{3})a)*(?:(*MAX{T})c)*
callout.c の結果と考察 no.017
1 parent e64d1ac commit e3fa2e2

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

MEMO_onig/callout/017.txt

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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+

0 commit comments

Comments
 (0)