-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAbsense_Zero.txt
88 lines (45 loc) · 2.38 KB
/
Absense_Zero.txt
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
==============================================================
(?~abc) に想定外であろうゼロ幅マッチを入れてみた
tonco-miyazawa 2021/12/22 - 2022/03/03
==============================================================
言葉の上では "\b を含まない文字列" を意味する (?~\b) を
"1" と ":" の間に置いて /1(?~\b):/ という正規表現を作る
この正規表現はテキスト "1:" にマッチする? それともしない?
..という訳で実験だ!
■ oniguruma 6.9.7
simple.c の 17,18行目を書き換えて実験
https://github.com/kkos/oniguruma/blob/master/sample/simple.c
検索表現: "1(?~\\b):"
対象テキスト: "1:"
結果=> 1: にマッチした
■ Onigmo 6.2.0
simple.c の 16,17行目を書き換えて実験
https://github.com/k-takata/Onigmo/blob/master/sample/simple.c
検索表現: "1(?~\\b):"
対象テキスト: "1:"
結果=> マッチせず
※ (?~\b) は Onigmo に存在する非包含オペレータのバグの影響を受けない
"\b" はマッチする文字数がゼロ幅で不変なため
■ Perl5 5.32.1 先読みを使った疑似非包含
$str = "1:";
$str =~ s/1(?:(?!\b).)*:/<match>/;
結果=> 1: にマッチ
■■■■■ 結論 ■■■■■
■ perl5
perl5版は書き方による仕様であることは明らか
0回の繰り返しでもマッチしてしまうためゼロ幅マッチを防げない
■ oniguruma
いろいろ試したところ、oniguruma は (?~abc) がマッチする
領域の右端の位置では弾くべきゼロ幅マッチがあっても弾けず
マッチしてしまうようだ
これは perl5版の疑似非包含も持つ特徴だ
oniguruma の (?~abc) と perl5版の疑似非包含は動作がとても
似ているので perl5版に慣れている人には使いやすいはず
■ Onigmo
Onigmo の非包含オペレータはゼロ幅マッチ対応! 拍手~!
ただし、中に入れる正規表現によっては下記のバグを考慮する
必要があるので要注意だ
Onigmo の非包含オペレータのバグを再現する方法
https://github.com/tonco-miyazawa/regex_etc/blob/master/MEMO_Onigmo/bug_absence.txt
-----------------------------------------------------
おわり