質問するログイン新規登録

回答編集履歴

1

文法規則

2019/09/03 14:59

投稿

think49
think49

スコア18194

answer CHANGED
@@ -14,4 +14,30 @@
14
14
  console.log(JSON.stringify(result2)); // ["12:44"," hogehogehogehoge\nfogefogefoge ","01:30","\nfogefoge ","5:30"," hogehoge"]
15
15
  ```
16
16
 
17
+ ### 文法規則
18
+
19
+ ざっくり書きましたが、本来は例えば、下記文字列に**部分一致**しても良いのか、をしっかり考えて正規表現を書くのが正道です。
20
+
21
+ ```JavaScript
22
+ console.log('111:222:333:444'.match(/([0-5]?\d:[0-5]?\d)/g)); // ["11:22", "2:33", "3:44"]
23
+ console.log('1:2:3:4'.match(/([0-5]?\d:[0-5]?\d)/g)); // ["1:2", "3:4"]
24
+ console.log('23:35:49'.match(/([0-5]?\d:[0-5]?\d)/g)); // ["23:35"]
25
+ ```
26
+
27
+ この場合、「マッチしない文字列」でこれらを消費してしまえば、「マッチさせない文字列」として扱う事が可能ですが、
28
+
29
+ - 「マッチする文字列」の文法規則
30
+ - 「マッチしない文字列」の文法規則
31
+
32
+ はそれぞれ独立して定義するので、「マッチする文字列」から「マッチしない文字列」の正規表現が自動的に決定されるものではありません。
33
+ 「先読み」「後読み」を駆使すれば、自動的に決定する完璧な「マッチする文字列の正規表現」が実現できなくもないですが、「後読み」の実装が不安定です。
34
+
35
+ ```JavaScript
36
+ const fix1 = string => string.match(/\D*(?:\d+(?::\d+){2,}|(?![0-5]?\d:[0-5]?\d)[\s\S])+|[0-5]?\d:[0-5]?\d/g);
37
+
38
+ console.log(fix1('111:222:333:444')); // ["111:222:333:444"]
39
+ console.log(fix1('1:2:3:4')); // ["1:2:3:4"]
40
+ console.log(fix1('23:35:49')); // ["23:35:49"]
41
+ ```
42
+
17
43
  Re: Kimsehwa さん