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

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

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

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

5回答

774閲覧

Javascript | 'あ●い▲う'などの文字列をsplitなど用いて区切り文字も含めた配列にしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

4グッド

8クリップ

投稿2019/03/06 10:10

編集2019/03/07 03:27

現状(1)

const str = 'あああ■いいい■ううう■えええ■おおお'; arr = str.split('■'); console.log(array); // ['あああ','いいい','ううう','えええ','おおお']

第一ステージとして、以下のような配列を期待しているので

['あああ','■','いいい','■','ううう','■','えええ','■','おおお'];

以下の解放を作りました。

const str = 'あああ■いいい■ううう■えええ■おおお' const splitString = '■' const arr = str.split(splitString); arr.forEach(function(element,index) { if (index%2 == 0){ return } arr[index] = '■' });

今回したいこと。

以下にあるような配列を期待したいのですが、なかなか解法が浮かびません。

const str = 'あああ■いいい▲ううう■えええ▲おおお'; const arr = str.split(/■|▲/); console.log(arr); // [ 'あああ', 'いいい', 'ううう', 'えええ', 'おおお' ] //// 何らかの処理... ////////////// 期待する配列 ///////////////// console.log(arr); // ['あああ', '■', 'いいい', '▲', 'ううう', '■', 'えええ', '▲', 'おおお'];

もし実装が可能な方いらっしゃったらご教授、助言などいただけると幸いです。
また現状(1)のコードのアドバイス等も頂けると幸いです。よろしくお願いします。

gogojp, redshoga, Lhankor_Mhy, papinianus👍を押しています

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

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

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

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

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

kei344

2019/03/07 03:20

予想するくらいなら別質問にすればよいのでは。例示する文字列やコードは実際使用するものと同じ物を用意したほうが良いですよ。
退会済みユーザー

退会済みユーザー

2019/03/07 03:56 編集

やはりそうしますね、ありがとうございます! 手が空いた際にコメントやベストアンサーの決定などさせていただきます!
guest

回答5

0

ベストアンサー

こんな感じでしょうか?

javascript

1console.log('あああ■いいい▲ううう■えええ▲おおお'.split(/([■|▲]+)/)); 2// => [ 'あああ', '■', 'いいい', '▲', 'ううう', '■', 'えええ', '▲', 'おおお' ]

参考: 正規表現でマッチした要素を残しつつsplitしたい - DRYな備忘録

投稿2019/03/06 10:30

redshoga

総合スコア196

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

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

退会済みユーザー

退会済みユーザー

2019/03/07 01:15 編集

ありがとうございます...こんな1行でできるなんて... 正規表現について確認させていただけないでしょうか、 / ... / 正規表現の始まり終わり ( ) キャプチャ [ ... | ... ] OR は多分認識はあってると思うのですが、 + は直前の文字(または文字列)の1回以上の繰り返しという意味でしょうか。
guest

0

js

1 const str = 'あああ■いいい▲ううう■えええ▲おおお'; 2 str.match(/■|▲|.+?(?=[■|▲])|.+/g); 3 4/* 5あああ,■,いいい,▲,ううう,■,えええ,▲,おおお 6*/

投稿2019/03/06 10:25

Lhankor_Mhy

総合スコア36074

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

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

0

「こうしたらできるのではないか」という考え方だけの回答です。
区切り文字の前後に区切り文字を含まない同じ文字列(1字よりも記号など組み合わせた方が良い)を投入し(正規表現を使った置換で良いと思います)、その文字列でsplit

※その投入する文字列群を事前に別の文字列に変換する処理を入れて、split後に戻すような対応まで出来ればなおよし

投稿2019/03/06 10:23

m.ts10806

総合スコア80850

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

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

0

以下の解放を作りました

これ動かしたら(5) ["あああ", "■", "ううう", "■", "おおお"]になって、
いいいえええの文字列が剥げるやん。
新しく空の配列を1個用意して、交互にpushしていくというやり方にしないと駄目だよ。


もうLhankor_Mhyさんとredshogaさんの回答には勝てないので
質問文のコードの考え方を元に無理やり改造して解いてみたよ。
これは中々に死ねるけど、中々綺麗なコードになったかも。

JavaScript

1const str = 'あああ■いいい▲ううう■えええ▲おおお'; 2 3// 対象の文字を配列にしてreduceでくくる 4// アロー関数使ってなかったのでES5でコードを書いた 5['■', '▲'].reduce(function (strs, splitString) { 6 var results = []; 7 strs.forEach(function (str) { 8 str.split(splitString).forEach(function(it, i){ 9 if (i !== 0) results.push(splitString); 10 results.push(it); 11 }); 12 }); 13 return results; 14}, [str]); 15// (9) ["あああ", "■", "いいい", "▲", "ううう", "■", "えええ", "▲", "おおお"]

こんな感じでreduceの開始を[str]にするのが拘りポイント、
後は一時的に二次元配列を作って、一次元配列に固め直すというやり方で解決できる。

投稿2019/03/06 11:14

編集2019/03/06 11:35
miyabi-sun

総合スコア21158

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

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

0

正規表現でマッチした要素を残しつつsplitしたい - DRYな備忘録

上記エントリーを参考に下記でいかがでしょうか。
(エントリーの丸パクリです)

javascript

1const str = 'あああ■いいい▲ううう■えええ▲おおお'; 2 3const rule = /[■|▲]+/g; 4 5let copy = str; 6 7const arr = []; 8 9src.match(rule).forEach(function(m) { 10 const i = copy.indexOf(m); 11 if (i != 0) { 12 arr.push(copy.slice(0, i - 1)); // マッチじゃない部分をpush 13 } 14 arr.push(copy.slice(i, i + m.length)); // マッチな部分をpush 15 copy = copy.slice(i + m.length); // pushした部分を削る 16}); 17if (copy.length != 0) { 18 arr.push(copy); // ケツに残りカスがあればpush 19} 20console.log(arr);

投稿2019/03/06 10:23

miyabi_takatsuk

総合スコア9528

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問