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

回答編集履歴

4

サンプルコードを追記

2017/05/12 23:04

投稿

think49
think49

スコア18194

answer CHANGED
@@ -19,13 +19,50 @@
19
19
 
20
20
  ちなみに、2文字以上の文字列を受け付ける汎用性を持たせれば、対応するHTMLタグにマッチさせる事も可能です。
21
21
 
22
- ### サンプル
22
+ ### サンプルコード
23
23
 
24
+ GitHubにサンプルコードをUPしました。
25
+ 質問の要件は満たせていると思います。
26
+
24
27
  - [find-corresponding-from-string.js - JSFiddle](https://jsfiddle.net/9cpdkfd3/)
25
28
  - [find-corresponding-from-string.js - GitHub](https://gist.github.com/think49/53b4a2cedfcff3c1a1ea40390a7ff3d8)
26
29
 
30
+ ```JavaScript
31
+ var string;
32
+
33
+ /**
34
+ * 「xxx」
35
+ */
36
+ string = '「「「a」, 「「b」」, 「「c」「d」」, 「「「e」「f」」」, 「「「g」」「「h」」」';
37
+ console.log(JSON.stringify(findCorrespondingFromString(string, '「', '」'))); // ["「a」","「「b」」","「「c」「d」」","「「「e」「f」」」","「「「g」」「「h」」」"]
38
+
39
+ /**
40
+ * <<xxx>>
41
+ */
42
+ string = '<<a>>,<<<<b>>>>,<<<<c>><<d>>>>';
43
+ console.log(JSON.stringify(findCorrespondingFromString(string, '<<', '>>'))); // ["<<a>>","<<<<b>>>>","<<<<c>><<d>>>>"]
44
+
45
+ /**
46
+ * <div>xxx</div>
47
+ */
48
+ string = `<div id="parent">
49
+ <p>text</p>
50
+ <div class="child">
51
+ <p>text</p>
52
+ <p>text</p>
53
+ <div class="grandson">
54
+ <p>text</p>
55
+ </div>
56
+ <div class="grandson">grandson2</div>
57
+ </div>
58
+ <div class="child">child2</div>
59
+ </div>`;
60
+ console.log(JSON.stringify(findCorrespondingFromString(string, '<div(?:\\s[^>]*)?>', '</div>'))); // [<div id="parent">...</div>]
61
+ ```
62
+
27
63
  ### 更新履歴
28
64
 
29
- - 2017/05/13 02:13 [サンプル] の節を追記。
65
+ - 2017/05/13 02:13 [サンプルコード] の節を追記。
66
+ - 2017/05/13 08:04 サンプルコードを追記。
30
67
 
31
68
  Re: hatena19 さん

3

\[サンプル\] の節を追記。

2017/05/12 23:04

投稿

think49
think49

スコア18194

answer CHANGED
@@ -19,4 +19,13 @@
19
19
 
20
20
  ちなみに、2文字以上の文字列を受け付ける汎用性を持たせれば、対応するHTMLタグにマッチさせる事も可能です。
21
21
 
22
+ ### サンプル
23
+
24
+ - [find-corresponding-from-string.js - JSFiddle](https://jsfiddle.net/9cpdkfd3/)
25
+ - [find-corresponding-from-string.js - GitHub](https://gist.github.com/think49/53b4a2cedfcff3c1a1ea40390a7ff3d8)
26
+
27
+ ### 更新履歴
28
+
29
+ - 2017/05/13 02:13 [サンプル] の節を追記。
30
+
22
31
  Re: hatena19 さん

2

markdown修正

2017/05/12 17:13

投稿

think49
think49

スコア18194

answer CHANGED
@@ -10,7 +10,8 @@
10
10
  ### 3階層以上の括弧にマッチさせるには
11
11
 
12
12
  3階層以上の括弧に対応する為には開始文字(`「`)の数と終了文字(`」`)の回数が一致するまで再帰的にマッチさせる必要があります。
13
+ `RegExp#exec` で再帰的にマッチさせれば可能です。
13
- `RegExp#exec` で再帰的にマッチさせれば可能ですが、注意点として `「「「a」` のように対応する括弧で閉じられていないパターンの為にバックトラック処理(マッチに失敗した場合に失敗前の場所まで戻ってマッチをやり直す)が必要になります。
14
+ が、注意点として `「「「a」` のように対応する括弧で閉じられていないパターンの為に**バックトラック処理**(マッチに失敗した場合に失敗前の場所まで戻ってマッチをやり直す)が必要になります。
14
15
 
15
16
  1. `「「「a」` でマッチ失敗
16
17
  2. `「「a」` でマッチ失敗

1

不要な文言削除

2017/05/12 12:26

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,5 +1,3 @@
1
- >ただし、関数スコープがローカル変数を参照し続ける場合は別です。
2
-
3
1
  ### 括弧が2階層までの場合
4
2
 
5
3
  既に指摘されていますが、2階層までなら正規表現で一度にマッチさせる事が可能です。