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

回答編集履歴

3

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

2019/11/01 08:38

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

answer CHANGED
@@ -54,7 +54,7 @@
54
54
  次のようにチェックしながらどの文字を使うべきか検討してゆきます。
55
55
 
56
56
  ```
57
- 正規表現リテラル: RegExp()と違い、バッククォートを二重に書かずに済みます
57
+ 正規表現リテラル: RegExp()と違い、バックスラッシュ(\)を二重に書かずに済みます
58
58
 
59
59
  /\s?([0-6]?[0-9]\:[0-6]?[0-9])?\s?([\w]+)/g "g"は繰り返し
60
60
  =========================== =======

2

回答と解説の追記

2019/11/01 08:37

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

answer CHANGED
@@ -15,4 +15,55 @@
15
15
  ヒント:
16
16
  RegExp オブジェクトの引数
17
17
  1. パターン:時刻部分しか定義できていません。(正規表現をググる)
18
- 2. フラグ:3つめの期待値を得るためには?
18
+ 2. フラグ:3つめの期待値を得るためには?
19
+
20
+ 追記)
21
+ [正規表現 match() と exec() の違い](https://javascript.step-learn.com/contents/J124-diff-match-exec.html)にあるように、全体を一気に取得できる match() を使いました。
22
+
23
+ ```javascript
24
+ function regexTest(str){
25
+ var regex = RegExp("\s?([0-6]?[0-9]\:[0-6]?[0-9])?\s?([\w]+)","g")
26
+ , m
27
+ ;
28
+ //if ( m = regex.exec(str) ) {
29
+ if ( m = str.match(regex) ) { // matchを使う
30
+ //console.log( "matched:", m );
31
+
32
+ // マッチ結果 m には配列が来るので、期待値に合わせて調整
33
+ if( m.length === 1 ) {
34
+ str = m[0];
35
+ }
36
+ else if( m[0].match(/^[^\d]/) ) {
37
+ str = m.join("")
38
+ }
39
+ else {
40
+ str = m
41
+ }
42
+ return str
43
+ } else {
44
+ console.log('unmatch')
45
+ return undefined
46
+ }
47
+ }
48
+ var list = ['0:18 hoge','hoge 0:34 hoge','0:18 hoge 0:34 hoge'];
49
+ list.forEach( (src, idx) => {
50
+ console.log( `#${idx} result :`, regexTest( src ) )
51
+ });
52
+ ```
53
+ 正規表現のマッチパターンの作り方:
54
+ 次のようにチェックしながらどの文字を使うべきか検討してゆきます。
55
+
56
+ ```
57
+ 正規表現リテラル: RegExp()と違い、バッククォートを二重に書かずに済みます
58
+
59
+ /\s?([0-6]?[0-9]\:[0-6]?[0-9])?\s?([\w]+)/g "g"は繰り返し
60
+ =========================== =======
61
+ 0:18 hoge ---> '0:18 hoge'
62
+ ----------------------------------------
63
+ hoge -+-> 'hoge 0:34 hoge'
64
+ 0:34 hoge -+
65
+ ----------------------------------------
66
+ 0:18 hoge -+-> '0:18 hoge 0:34 hoge'
67
+ 0:34 hoge -+
68
+
69
+ ```

1

加筆

2019/11/01 08:29

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

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