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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2052閲覧

JavaScriptの正規表現で、「一番外側の括弧」で抽出したい

kamekamekame

総合スコア16

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/06/16 06:10

編集2019/06/17 00:54

###実現したいこと
正規表現について知りたいです。宜しくお願い致します。

このようなvalueがあります。
<input type="textarea" value="[いぬ[の] しっぽ] [ねこのしっぽ]いぬ ねこ ">

ここから、下記➀➁の配列を取得することは可能でしょうか?

###取得したい配列
➀「一番外側の括弧」という単位で配列
Array [ "いぬ[の] しっぽ", "ねこのしっぽ" ]

➁それ以外の文字列でスペース単位の配列
Array [ "いぬ", "ねこ" ]

###注意したい点
・括弧の入れ子の数は不明です。

・括弧は必ずセットになります。(たとえば[いぬ[の]] しっぽ]のように括弧がセットにならないということはありません。)

###試したこと
なんとなく大枠の流れはできたのですが、やはり正規表現の部分で躓いています。
下記ですと「一番外側の括弧」ではなく「括弧が出現するたびに」という感じになってしまいます。

どうすればいいか教えて頂けませんでしょうか。

<input type="textarea" value="[いぬ[の] しっぽ] [ねこのしっぽ]いぬ ねこ "> $('input').on('input', function() { // 入力値を取得 const inputVal = $(this).val(); // ➀「一番外側の括弧」という単位で配列 const range = /[([^[] ]+)/g; // ここで「一番外側の括弧」という指定がしたい let match; let rangeArr = []; while ( (match = range.exec(inputVal))!== null ) { rangeArr.push(match[1]); } console.log( 'rangeArr' ); console.log( rangeArr ); // ➁それ以外の文字列でスペース単位の配列 const spaceArr = inputVal.replace(range,'').split(/[\u3000&\x20;]/g); console.log( 'spaceArr' ); console.log( spaceArr ); });

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

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

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

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

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

guest

回答2

0

ベストアンサー

正規化された文字列には見えないので、正規表現でやるのは厳しいんじゃないでしょうか……

js

1let blankets = []; 2let counter = 0; 3let source = "[いぬ[の] しっぽ] [ねこのしっぽ]いぬ ねこ "; 4 5source.split('').forEach(char => { 6 if(char === ']') { 7 counter--; 8 } 9 if(char === '[') { 10 counter++; 11 if(counter === 1) { 12 blankets.push(''); 13 return; // continue 14 } 15 } 16 if(counter > 0) blankets[blankets.length - 1] += char; 17}); 18 19let temp = source; 20blankets.forEach(str => temp = temp.replace(`[${str}]`, '')); 21let spaces = temp.trim().split(' '); 22 23console.log(blankets); 24// -> (2) ["いぬ[の] しっぽ", "ねこのしっぽ"] 25console.log(spaces); 26// -> (2) ["いぬ", "ねこ"]

投稿2019/06/17 01:13

thyda.eiqau

総合スコア2982

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

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

kamekamekame

2019/06/17 03:14

入れ子の数が悩みどころでしたが、カウンターとは!巧いですね。勉強になりました。キモな機能だったのでかなり助かります。どうもありがとうございました!
guest

0

以下、未検証です。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions

JavaScript

1while (tokenGroup = /([^[]+)|[([^]]*)]/g.exec(string)) { 2 const tokenList = tokenGroup.split(' '); 3}

質問を誤読していました。
対応する括弧を取得したかったのですね。
https://teratail.com/questions/156083#reply-234347
https://gist.github.com/think49/071350bcc987d82dd836885ea6f5c0d4

Re: kamekamekame さん

投稿2019/06/16 23:45

編集2019/06/17 03:47
think49

総合スコア18162

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

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

kamekamekame

2019/06/17 00:04 編集

ありがとうございます。仰ることがわかっていないせいか、できないようでした。 ですがリンク先やexecというメソッドについてありがとうございます。引き続き考えてみます。
think49

2019/06/17 03:49

すみません。質問を誤読していました。 履歴から気がついたようですが、同案件の過去回答へのリンクを貼っておきました。
kamekamekame

2019/06/17 04:52

ありがとうございます。仰るようにあなたのご回答履歴を漁り笑、そちらにあったgithubを使わせて頂きました。 その後thyda.eiqau様からのご回答もあり、いずれの方法でもできることが確認できまして、その贅沢さにいささか恐縮しております。m(__)m ところでお二方のコードですが、正規表現を使っているかどうかの違いで、やっていることは同じですよね。 いまいちわからないのですが、正規表現を使うことについてはどのようなメリットがあるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問