🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

625閲覧

javascriptの正規表現について

uer03108

総合スコア194

JavaScript

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/01/14 09:55

編集2021/01/14 10:13

久しぶりに正規表現を使ったのですが、不明な点が出てきましたのでご助言をお願い致しますm(_ _)m
やりたいことは下記になります。

検索文字列
startbbbbendccccstartddddend

抽出したい文字列
bbbb
dddd

 ※start****endで挟まれた文字列。

取り合えず、下記のコードで試してみましたが上手くいきませんでした。
惜しいところまでは行ったのですが、何がいけないのでしょうか。
ご指摘をお願い致します!

js

1 2 //対象文字列 3 let str = 'startbbbbendccccstartddddend'; 4 5 //パターン 6 let regex = new RegExp('start(.*?)end', "g"); //最短一致 7 8 //マッチング 9 let aryMatch = regex.exec(str); 10 11 //表示 12 console.log(aryMatch); //["startbbbbend", "bbbb"] 13 14 // 15 let result = str.match(/start(.*?)end/g); 16 17 //表示 18 console.log(result); //["startbbbbend", "startddddend"] <- 一応グループ化()していると思うのですが 19

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

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

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

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

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

guest

回答2

0

最近、同じ質問に回答しました。
https://teratail.com/questions/314855

投稿2021/01/14 10:22

編集2021/01/14 10:23
otn

総合スコア85882

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

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

uer03108

2021/01/14 11:55

有難うございます!
guest

0

ベストアンサー

RegExp.prototype.exec()を利用する場合はwhileループを使う必要があります。

js

1let str = 'startbbbbendccccstartddddend'; 2let regex = /start(.*?)end/g 3 4let results = []; 5let match; 6while ((match = regex.exec(str)) !== null) { 7 results.push(match[1]); 8} 9console.log(results); //=> [ 'bbbb', 'dddd' ]

gフラグありの場合、String.prototype.match()の戻り値はキャプチャグループを返さないため、今回の用途には適していないかと思います。

また別解としてString.prototype.matchAll()を使う方法もあります。

js

1let str = 'startbbbbendccccstartddddend'; 2let regex = /start(.*?)end/g 3let results = []; 4let matches = str.matchAll(regex); 5for (let match of matches) { 6 results.push(match[1]); 7} 8console.log(results); //=> [ 'bbbb', 'dddd' ]

投稿2021/01/14 10:20

neko_the_shadow

総合スコア2349

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

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

uer03108

2021/01/14 11:56

丁寧なご回答、有難うございました。 whileを使用するのですね。 了解いたしました。 有難うございました!
uer03108

2021/01/14 13:00

申し訳ありません。 お伺いして宜しいでしょうか。 複数行に対応するためにドット"."を[\s\S]に変更すると、RegExpの場合は動作しませんでした。 この原因は分かりますでしょうか。 //パターン let regex = new RegExp('start(.*?)end', "g"); //動作する let regex = new RegExp('start([\s\S]*?)end', "g"); //動作しない //パターン aryMatch = str.matchAll(/start(.*?)end/g); //動作する aryMatch = str.matchAll(/start([\s\S]*?)end/g); //動作する
uer03108

2021/01/14 13:06

解決いたしました。 \を2つ描く必要がありました。 お手数をお掛け致しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問