質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

5回答

166閲覧

JSの文字列を配列で順に検索改行か置換をするにはどうすればいいですか

tomeater

総合スコア15

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/09/16 00:19

編集2018/09/16 00:21

JSの文字列を配列のデータで順に文字列先頭から検索して改行していくのはどうすればいいでしょうか。

ネットや本をいろいろ調べても
個別の処理は書いてるのですが
組み合わせ方を説明してるものが見つからずでした。

例えば

var str = 'この世をばわが世とぞ思ふ望月の欠けたることもなしと思へば';

var array = ['ば', 'ふ','の', 'も'];

この世をば
わが世とぞ思ふ
望月の
欠けたることも
なしと思へば

という形にしたいです。

または

この世をば、わが世とぞ思ふ、望月の、欠けたることも、なしと思へば

という風に配列のデータで文字列検索して「、」を挿入するのでもいいのですが

調べても個別の処理しか説明がなかったので

処理の組み合わせ方などアドバイスお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

think49

総合スコア18164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomeater

2018/09/17 01:48

ありがとうございます。形態素解析について調べてみます。
guest

0

が条件に入っちゃってるので
「この、世をば」と、2文字目の「の」もヒットしてしまいますね。
これ回避するのはかなり厳しいですね。

で、kei344 さんの回答でもいいんですが、末尾の「思へば」のあとにも「、」が入ってしまうので、

// 改行 'この世をばわが世とぞ思ふ望月の欠けたることもなしと思へば'.replace(/([ばふのも])([^$])/g, '$1\n$2'); // 読点 'この世をばわが世とぞ思ふ望月の欠けたることもなしと思へば'.replace(/([ばふのも])([^$])/g, '$1、$2');

こうやって末尾に余計な読点や改行が入っちゃうのを回避できます。

投稿2018/09/16 01:03

spookybird

総合スコア1803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomeater

2018/09/17 01:47

ありがとうございます。もっと精進します。
guest

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

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomeater

2018/09/19 11:28

ありがとうございます。まだまだひよっこなのでどなたの回答がベストアンサーなのか理解に至らず足踏みしていました。こちらの回答は配列ありなので、ベストアンサーとなりました。
guest

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

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomeater

2018/09/17 01:47

ありがとうございます。こういう場合は配列は文字列とみなしたほうがいいと理解しました。
guest

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

tomeater

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問