JSの文字列を配列のデータで順に文字列先頭から検索して改行していくのはどうすればいいでしょうか。
ネットや本をいろいろ調べても
個別の処理は書いてるのですが
組み合わせ方を説明してるものが見つからずでした。
例えば
var str = 'この世をばわが世とぞ思ふ望月の欠けたることもなしと思へば';
var array = ['ば', 'ふ','の', 'も'];
を
この世をば
わが世とぞ思ふ
望月の
欠けたることも
なしと思へば
という形にしたいです。
または
この世をば、わが世とぞ思ふ、望月の、欠けたることも、なしと思へば
という風に配列のデータで文字列検索して「、」を挿入するのでもいいのですが
調べても個別の処理しか説明がなかったので
処理の組み合わせ方などアドバイスお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
処理の組み合わせ方の説明が見つからない
調べても個別の処理しか説明がなかったので処理の組み合わせ方などアドバイスお願いします。
「組み合わせ方」は「答えそのもの」です。
これから書こうとしているコードの組み合わせが全て先行者によって発見されているなら、新しい発明は生まれないですよね。
組み合わせを考えるのは、あなた自身だと私は思います。
コード
既に回答が2つもついており、今更、答えを隠しても仕方がないので書いてしまいますが、
JavaScript
1var str = 'この世をばわが世とぞ思ふ望月の欠けたることもなしと思へば'; 2 3str = str.replace(/(?:(この世)|([ばふのも]))(?!$)/g, (m, i, w) => (i || w + '、')); 4console.log(str); // "この世をば、わが世とぞ思ふ、望月の、欠けたることも、なしと思へば"
「この世」に句点を入れてはなりませんが、「さちこの世帯」には句点を入れなければなりません(「この世」に句点を入れてはならないルールだけ適用すると、誤爆します)。
「あの世」にも句点を入れてはなりませんが、「みりあの世帯」には句点を入れなければなりません。
例外規定を考えていくと、「いたちごっこ」となり、キリがない事に気が付きます。
最終的には形態素解析を使う事になると思われます。
Re: tomeater さん
投稿2018/09/16 03:07
総合スコア18164
0
の
が条件に入っちゃってるので
「この、世をば」と、2文字目の「の」もヒットしてしまいますね。
これ回避するのはかなり厳しいですね。
で、kei344 さんの回答でもいいんですが、末尾の「思へば」のあとにも「、」が入ってしまうので、
// 改行 'この世をばわが世とぞ思ふ望月の欠けたることもなしと思へば'.replace(/([ばふのも])([^$])/g, '$1\n$2'); // 読点 'この世をばわが世とぞ思ふ望月の欠けたることもなしと思へば'.replace(/([ばふのも])([^$])/g, '$1、$2');
こうやって末尾に余計な読点や改行が入っちゃうのを回避できます。
投稿2018/09/16 01:03
総合スコア1803
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
十中八九考えすぎなのでしょうが、質問の意図を、文字列に対して、配列の先頭から順に文字を探していき、その文字が見つかった場所で改行し、配列の次の要素に進むと理解しました。
つまり、他の方の回答にあるように、「の」があるから「この、世」ではなく、まずは「ば」を探し、ばがあった場所より後ろで、「ふ」を探し、その場所以降で「の」を探しとすると、題意に破綻がない解釈を行うことができます。
こういう解釈を私にされてしまうということは質問(というか要件)が詰め切れていないということです。それはすなわち、欲しいものが何か分からないので欲しいものを得ることができない、のです。
なお下記では、探索する要素がなかったらそこで中断するような処理にしています。
(なんか思ったよりダサいコードになりました)
※ こういうことを言うと、探している文字は絶対に対象に含まれます、とか言う人がいるのですが、何にも保証されていないコードで探したいものがあるなんて発言は信用に値しません。
javascript
1var array = ['ば', 'ふ','の', 'も']; 2var str = "この世をばわが世とぞ思ふ望月の欠けたることもなしと思へば"; 3 4function sep(str, array, ret) { 5 6 if(array.length === 0) { 7 ret.push(str); 8 return ret; 9 } 10 let cur = array.shift(); 11 let pos = str.indexOf(cur); 12 if(pos === -1) { 13 ret.push(str); 14 return ret; 15 } 16 ret.push(str.substring(0, pos + 1)); 17 return sep(str.substring(pos + 1),array, ret); 18} 19 20console.log(sep(str,array,[]));
投稿2018/09/18 14:32
総合スコア12705
0
何をどう調べて、何が要件と違ったかを質問文に含めたほうがよいですよ。
ちなみに提示の要件であれば「もも」「ふふふ」とかも置換されることになります。
js
1'この世をばわが世とぞ思ふ望月の欠けたることもなしと思へば'.replace(/([ばふのも])/g, '$1、')
【String.prototype.replace() - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace
投稿2018/09/16 00:34
総合スコア69407
0
まだ経験が浅いのでこういう風にしか書けませんでした。
javascript
1 2<script> 3 4var str0='この世をばわが世とぞ思ふ望月の欠けたることもなしと思へば'; 5 6if(str0.indexOf("ば")>=0){var str1=str0.substring(str0.indexOf("ば")+1,str0.length);} 7var str2 = str0.replace(str1 ,''); document.write(str2+"<br>"); 8 9if(str0.indexOf("ふ")>=0){var str2=str1.substring(str1.indexOf("ふ")+1,str1.length);} 10var str3 = str1.replace(str2 ,''); document.write(str3+"<br>"); 11 12if(str0.indexOf("の")>=0){var str3=str2.substring(str2.indexOf("の")+1,str2.length);} 13var str4 = str2.replace(str3 ,''); document.write(str4+"<br>"); 14 15if(str0.indexOf("も")>=0){var str4=str3.substring(str3.indexOf("も")+1,str3.length);} 16var str5 = str3.replace(str4 ,''); document.write(str5+"<br>"); 17 18if(str0.indexOf("ば")>=0){var str5=str4.substring(str4.indexOf("ば")+1,str4.length);} 19var str6 = str4.replace(str5 ,''); document.write(str6+"<br>"); 20 21 22</script> 23
投稿2018/09/17 01:52
総合スコア15
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/17 01:48