###実現したいこと
テキストのタグ
を#タグ
としたいです。
この条件がございまして、実は全てクリアできています。
・前にシャープをつける
・後ろにスペースをつける
・前がpattern
と.match()
しなければ前にスペースをつける
・先頭なら前のスペースなし、末尾なら後ろのスペースなし
・タグが連続したあ間のスペースは1つ
・元からタグならそのまま
###問題
昨日から取り組んでいる内容で、教えて頂いたり改変したりでなんとか上の条件はクリアできました。
以下のようにstr
が
食パンあとジャムパンあとごまあんぱん
のときは
#食パン あと #ジャムパン あと #ごまあんぱん
となり理想的なのですが、
しかしstr
が
食パンジャムパンごまあんぱん
のときは
#食パン ジャムパン #ごまあんぱん
となってしまいます。
ジャムパンが抜けてしまうのです。
###コード
こちらは昨日yambejp様から頂戴したコードについて、is_tag()
やescapeRegExp()
という関数を加えたものになります。
実行して頂くとジャムパンが抜けてしまうことがご覧いただけるかと思います。
JavaScript
1var ARR = [ 2 {name:'食パン',id:1}, 3 {name:'あんぱん',id:2}, 4 {name:'ごまあんぱん',id:3}, 5 {name:'食パン(はちみつ味)',id:4}, 6 {name:'ジャムパン',id:5} 7]; 8 9var str = "食パンジャムパンごまあんぱん"; 10console.log( get(str) ); // ジャムパンが抜けてしまう 11 12function get( str ){ 13 14 var pattern = ["","。","、","!","!"]; 15 16 var reg = new RegExp("(^|.)("+ARR.map(x=>escapeRegExp(x.name)).sort((x,y)=>x.length<y.length).join('|')+")(.|$)","g"); 17 18 var res = str.replace( 19 20 reg,x=>( ( r=x.match(new RegExp(reg.source)) ) ) && 21 22 // 元からタグの場合はそのまま 23 is_tag(r[1],r[3]) ? x : 24 25 // タグ化する 26 r[1] 27 + ( pattern.indexOf(r[1])>=0 ? "" : " " ) 28 + "#" 29 + r[2] 30 + ( r[3]=="" ? "" : " " ) 31 + r[3] 32 33 ); 34 35 return res; 36 37 // 前がシャープ、後がスペース|patternならばタグ 38 function is_tag( before, after ){ 39 var before_match = before.match(/^[##]$/); 40 var after_match = after.match(/^\s$/) || after.match(pattern); 41 return ( before_match && after_match ) ? true : false; 42 } 43} 44 45// 正規表現をエスケープ 46function escapeRegExp(string) { 47 return string.replace(/[\^$.*+?()[]{}|]/g, '\$&'); 48} 49
###試したこと
ジャムパンが受け取れない原因をさぐるためにx
を出力してみましたら、やはりこの結果がおかしかったです。
var res = str.replace( reg,x=>( ( r=x.match(new RegExp(reg.source)) ) ) && console.log('x=「'+x+'」') );
以下の結果となり、ジャムパンが受け取れないのはやはりx
がおかしいからだとわかりましたが…しかし、いつどこでジャムパンが消えてしまうのか、どうしてもわかりません。
x=「食パンジ」 x=「ンごまあんぱん」
さらに以下でreg.source
やstr
もみましたが、それらにはジャムパンがありました。いつx
からジャムパンが消えてしまうのか、さっぱりです。
var res = str.replace( reg,x=>( ( r=x.match(new RegExp(reg.source)) ) ) && console.log('x=「'+x+'」') +console.log('str=「'+str+'」') +console.log('reg.source=「'+JSON.stringify(reg.source)+'」') );
どうすればジャムパンについても実現できますでしょうか。
###補足情報(FW/ツールのバージョンなど)
特にバージョン情報は関係ないかと思いますが、もし解決策にjQueryをお使いになる場合がございましたら、最新の3.4での方法でお願いできましたら幸いです。
何卒、宜しくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/02 07:44
2020/04/02 07:53
2020/04/02 10:18