回答編集履歴

1

文法規則

2019/09/03 14:59

投稿

think49
think49

スコア18162

test CHANGED
@@ -30,4 +30,56 @@
30
30
 
31
31
 
32
32
 
33
+ ### 文法規則
34
+
35
+
36
+
37
+ ざっくり書きましたが、本来は例えば、下記文字列に**部分一致**しても良いのか、をしっかり考えて正規表現を書くのが正道です。
38
+
39
+
40
+
41
+ ```JavaScript
42
+
43
+ console.log('111:222:333:444'.match(/([0-5]?\d:[0-5]?\d)/g)); // ["11:22", "2:33", "3:44"]
44
+
45
+ console.log('1:2:3:4'.match(/([0-5]?\d:[0-5]?\d)/g)); // ["1:2", "3:4"]
46
+
47
+ console.log('23:35:49'.match(/([0-5]?\d:[0-5]?\d)/g)); // ["23:35"]
48
+
49
+ ```
50
+
51
+
52
+
53
+ この場合、「マッチしない文字列」でこれらを消費してしまえば、「マッチさせない文字列」として扱う事が可能ですが、
54
+
55
+
56
+
57
+ - 「マッチする文字列」の文法規則
58
+
59
+ - 「マッチしない文字列」の文法規則
60
+
61
+
62
+
63
+ はそれぞれ独立して定義するので、「マッチする文字列」から「マッチしない文字列」の正規表現が自動的に決定されるものではありません。
64
+
65
+ 「先読み」「後読み」を駆使すれば、自動的に決定する完璧な「マッチする文字列の正規表現」が実現できなくもないですが、「後読み」の実装が不安定です。
66
+
67
+
68
+
69
+ ```JavaScript
70
+
71
+ const fix1 = string => string.match(/\D*(?:\d+(?::\d+){2,}|(?![0-5]?\d:[0-5]?\d)[\s\S])+|[0-5]?\d:[0-5]?\d/g);
72
+
73
+
74
+
75
+ console.log(fix1('111:222:333:444')); // ["111:222:333:444"]
76
+
77
+ console.log(fix1('1:2:3:4')); // ["1:2:3:4"]
78
+
79
+ console.log(fix1('23:35:49')); // ["23:35:49"]
80
+
81
+ ```
82
+
83
+
84
+
33
85
  Re: Kimsehwa さん