回答編集履歴

3

バックスラッシュをバッククォートと誤記

2019/11/01 08:38

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

test CHANGED
@@ -110,7 +110,7 @@
110
110
 
111
111
  ```
112
112
 
113
- 正規表現リテラル: RegExp()と違い、バッククォートを二重に書かずに済みます
113
+ 正規表現リテラル: RegExp()と違い、バックスラッシュ(\)を二重に書かずに済みます
114
114
 
115
115
 
116
116
 

2

回答と解説の追記

2019/11/01 08:37

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

test CHANGED
@@ -33,3 +33,105 @@
33
33
  1. パターン:時刻部分しか定義できていません。(正規表現をググる)
34
34
 
35
35
  2. フラグ:3つめの期待値を得るためには?
36
+
37
+
38
+
39
+ 追記)
40
+
41
+ [正規表現 match() と exec() の違い](https://javascript.step-learn.com/contents/J124-diff-match-exec.html)にあるように、全体を一気に取得できる match() を使いました。
42
+
43
+
44
+
45
+ ```javascript
46
+
47
+ function regexTest(str){
48
+
49
+ var regex = RegExp("\s?([0-6]?[0-9]\:[0-6]?[0-9])?\s?([\w]+)","g")
50
+
51
+ , m
52
+
53
+ ;
54
+
55
+ //if ( m = regex.exec(str) ) {
56
+
57
+ if ( m = str.match(regex) ) { // matchを使う
58
+
59
+ //console.log( "matched:", m );
60
+
61
+
62
+
63
+ // マッチ結果 m には配列が来るので、期待値に合わせて調整
64
+
65
+ if( m.length === 1 ) {
66
+
67
+ str = m[0];
68
+
69
+ }
70
+
71
+ else if( m[0].match(/^[^\d]/) ) {
72
+
73
+ str = m.join("")
74
+
75
+ }
76
+
77
+ else {
78
+
79
+ str = m
80
+
81
+ }
82
+
83
+ return str
84
+
85
+ } else {
86
+
87
+ console.log('unmatch')
88
+
89
+ return undefined
90
+
91
+ }
92
+
93
+ }
94
+
95
+ var list = ['0:18 hoge','hoge 0:34 hoge','0:18 hoge 0:34 hoge'];
96
+
97
+ list.forEach( (src, idx) => {
98
+
99
+ console.log( `#${idx} result :`, regexTest( src ) )
100
+
101
+ });
102
+
103
+ ```
104
+
105
+ 正規表現のマッチパターンの作り方:
106
+
107
+ 次のようにチェックしながらどの文字を使うべきか検討してゆきます。
108
+
109
+
110
+
111
+ ```
112
+
113
+ 正規表現リテラル: RegExp()と違い、バッククォートを二重に書かずに済みます
114
+
115
+
116
+
117
+ /\s?([0-6]?[0-9]\:[0-6]?[0-9])?\s?([\w]+)/g "g"は繰り返し
118
+
119
+ =========================== =======
120
+
121
+ 0:18 hoge ---> '0:18 hoge'
122
+
123
+ ----------------------------------------
124
+
125
+ hoge -+-> 'hoge 0:34 hoge'
126
+
127
+ 0:34 hoge -+
128
+
129
+ ----------------------------------------
130
+
131
+ 0:18 hoge -+-> '0:18 hoge 0:34 hoge'
132
+
133
+ 0:34 hoge -+
134
+
135
+
136
+
137
+ ```

1

加筆

2019/11/01 08:29

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

test CHANGED
@@ -1,6 +1,8 @@
1
- regex.test() はマッチした結果を返します。
1
+ regex.test() はマッチしたかどうかの結果を返します。
2
2
 
3
+ regex.exec() はパターンにどのようにマッチしたかの配列を返します。
4
+
3
- matched のように適当な変数に代入する必要ります。
5
+ matched のように適当な変数に代入すると、パターンとの関係つかみやすくなります。
4
6
 
5
7
 
6
8
 
@@ -10,7 +12,7 @@
10
12
 
11
13
  let matched;
12
14
 
13
- if (matched = regex.test(str)) {
15
+ if (matched = regex.exec(str)) {
14
16
 
15
17
  console.log( "matched :", matched);// 配列
16
18