#前提・実現したいこと
文章中に存在するカッコ(全角)の中身を自動検知してハイライトする機能をJavaScriptと正規表現を用いて実装したいと考えています。
普通にカッコ部分をハイライトするだけであれば単純なのですが、下記のように、カッコが多重(最大4重を想定)になっている文章にも対応し、カッコのレベル毎に異なる色でハイライトしたいと考えています。
例えば、次のような感じです。
- カッコなし部分(あいうえお) →ハイライトなし
- 第1カッコ部分(かきくけこ) →黄色
- 第2カッコ部分(さしすせそ) →黄緑色
- 第3カッコ部分(たちつてと) →青色
- 第4カッコ部分(なにぬねの) →ピンク色
html
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8 <link rel="stylesheet" href="css/reset.css"> 9 <link rel="stylesheet" href="css/style.css"> 10</head> 11<body> 12 <p class="controlpanel"> 13 <input type="button" value="ハイライトON/OFF" id="btn-onoff"> 14 </p> 15 <div id="content"> 16 <!-- 以下が検索対象の文章(例)です。 --> 17 ① あいうえおあいうえお。<br> 18 ② あいうえお(かきくけこかきくけこ。)あいうえお。<br> 19 ③ あいうえお(かきくけこ(さしすせそさしすせそ。)かきくけこ。)あいうえお。<br> 20 ④ あいうえお(かきくけこ(さしすせそ(たちつてとたちつてと。)さしすせそ。)かきくけこ。)あいうえお。<br> 21 ⑤ あいうえお(かきくけこ(さしすせそ(たちつてと(なにぬねの。)たちつてと。)さしすせそ。)かきくけこ。)あいうえお。<br> 22 </div> 23 <script src="js/jquery-3.3.1.min.js"></script> 24 <script src="js/script.js"></script> 25</body> 26</html>
js
1var backupOriginal = ""; 2 3// 文字列を検索してハイライト用要素を加える 4function replacer( str, word , att ) { 5 var SearchString = '(' + word + ')'; 6 var RegularExp = new RegExp( SearchString, "g" ); 7 var ReplaceString = '<span class="' + att + '">$1</span>'; 8 var ResString = str.replace( RegularExp , ReplaceString ); 9 return ResString; 10} 11 12// ハイライトを加える 13window.onload = function(){ 14 function addhighlight() { 15 backupOriginal = document.getElementById("content").innerHTML; 16 var forShow = backupOriginal; 17 // 単数括弧の場合 18 forShow = replacer( forShow, "((.*?))", "mark1" ); // 第1括弧の中身をキャプチャ=黄 19 // 二重括弧の場合 20 forShow = replacer( forShow, "(([^)]*(.*?)[^(]*))", "mark1" ); // 第1括弧の中身をキャプチャ=黄 21 forShow = replacer( forShow, "([^)]*((.*?))[^(]*)", "mark2" ); // 第2括弧の中身をキャプチャ=黄緑 22 // 三重括弧の場合 23 forShow = replacer( forShow, "(([^)]*([^)]*(.*?)[^(]*)[^(]*))", "mark1" ); // 第1括弧の中身をキャプチャ=黄 24 forShow = replacer( forShow, "([^)]*(([^)]*(.*?)[^(]*))[^(]*)", "mark2" ); // 第2括弧の中身をキャプチャ=黄緑 25 forShow = replacer( forShow, "([^)]*([^)]*((.*?))[^(]*)[^(]*)", "mark6" ); // 第3括弧の中身をキャプチャ=青 26 // 四重括弧の場合 27 forShow = replacer( forShow, "(([^)]*([^)]*([^)]*(.*?)[^(]*)[^(]*)[^(]*))", "mark1" ); // 第1括弧の中身をキャプチャ=黄 28 forShow = replacer( forShow, "([^)]*(([^)]*([^)]*(.*?)[^(]*)[^(]*))[^(]*)", "mark2" ); // 第2括弧の中身をキャプチャ=黄緑 29 forShow = replacer( forShow, "([^)]*([^)]*(([^)]*(.*?)[^(]*))[^(]*)[^(]*)", "mark6" ); // 第3括弧の中身をキャプチャ=青 30 forShow = replacer( forShow, "([^)]*([^)]*([^)]*((.*?))[^(]*)[^(]*)[^(]*)", "mark3" ); // 第4括弧の中身をキャプチャ=ピンク 31 32 document.getElementById("content").innerHTML = forShow; 33 } 34 35 // ハイライトを消す 36 function clearhighlight() { 37 document.getElementById("content").innerHTML = backupOriginal; 38 backupOriginal = ""; 39 } 40 // ハイライトを加えるか消すかを判断 41 function highlightcheck() { 42 if( backupOriginal.length == 0 ) { 43 addhighlight(); 44 } else { 45 clearhighlight(); 46 } 47 } 48 49 document.getElementById("btn-onoff").onclick = highlightcheck; 50}; 51
#発生している問題
実行すると以下のようになり、③以下が上手くハイライトできていません。
以下のような処理結果(wordで作成)になるようにしたいのですが、どのようにコーディングしたらよいでしょうか。
Rubular(https://rubular.com/)で上記JavaScript中の正規表現を試したところ、マッチ・キャプチャともに上手くいきましたので、正規表現自体は合っているように思われるのですが。。
正規表現にお詳しい方、どうぞよろしくお願いいたします。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/21 10:29
2019/01/21 10:34
2019/01/24 13:03