\r\n```","answerCount":4,"upvoteCount":0,"datePublished":"2021-09-23T17:22:57.794Z","dateModified":"2022-01-12T10:55:45.698Z","suggestedAnswer":[{"@type":"Answer","text":"先読み言明、後読み言明を使うといいでしょう。\r\n\r\n[言明 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions/Assertions)\r\n\r\nこれらは特定の「位置」にマッチする正規表現です。\r\nたとえば `(?=aaa)` は `aaa` の直前にマッチし、`(?<=aaa)` は `aaa` の直後にマッチします。\r\n\r\nつまり `aaa(` の直後から `)` の直前までの `.*`(0 個以上の任意の文字) を検索すればいいわけですが、単純に `.*` と書いてしまうと、最長一致の法則によりたとえば `aaa(bbb) ccc(ddd)` であれば最後の閉じカッコの直前までの `bbb) ccc(ddd` にマッチしてしまいます。\r\nこれを防ぐために `.*` ではなく `.*?` あるいは `[^)]*` と書けば、最初の閉じカッコの直前までにマッチします。\r\n\r\n```javascript\r\nconst regex = /(?<=aaa().*?(?=))/g;\r\nconst founds = paragraph.match(regex);\r\nalert(founds[0]);\r\n```\r\n\r\nfounds には配列が入るので、そのうち最初の要素を取り出したい時には上記のように `founds[0]` を使います。","dateModified":"2021-09-24T02:08:53.496Z","datePublished":"2021-09-24T00:36:18.706Z","upvoteCount":0,"url":"https://teratail.com/questions/361033#reply-491854","comment":[{"@type":"Comment","text":"質問者凍結。無言だと思ったらやっぱり例のやつだったか。","datePublished":"2021-10-12T05:28:58.527Z","dateModified":"2021-10-12T05:28:58.527Z"}]},{"@type":"Answer","text":"> マッチの条件は()の中身の文字全てという形\r\n\r\nとしているのに\r\n\r\n> b1d2と出したい\r\n\r\nというのは、命題がぶれています。\r\n複数あった場合すべて出すなら戻り値は配列にしてください\r\n文字列を返すならすべてではなく最初の1つだけ返してください\r\n\r\n```javascript\r\nconst paragraph=\"ccc(d2nb1) aaa(b1d2) bbb(d2nb1)\";\r\nconst regex = /(?<=aaa().+?(?=))/;\r\nconst found = paragraph.match(regex)[0];\r\nconsole.log(found);\r\n```","dateModified":"2021-09-24T00:18:39.505Z","datePublished":"2021-09-24T00:18:39.505Z","upvoteCount":0,"url":"https://teratail.com/questions/361033#reply-491850","comment":[]},{"@type":"Answer","text":"質問に\r\n\r\n> const regex = /aaa(*)/g;\r\n\r\nとありよって、正規表現に`g` フラグがあるゆうことは、`aaa(b1d2)`みたいな `aaa`のやつは、 `paragraph` ん中に複数出てくることがあって、それらの全部について、丸カッコの中だけ取ってきたいゆう話やと思うたで。それやったら、こない\r\n```javascript\r\nconst regex = /aaa(([^)]+))/g;\r\nconst found = Array.from(paragraph.matchAll(regex), m => m[1]);\r\n```\r\nな感じかのう ➡ [サンプル](https://codepen.io/i8086x/pen/GREXWXa?editors=0012)\r\n\r\n**追記:**\r\n\r\n**最短マッチ** を使う方法もあるで。上のコードでは、`/aaa(([^)]+))/g` としていて、これの中にある `[^)]+` は、「`)`ではない文字の1つ以上の連続」を表して、この「`)`ではない文字」という指定をせずに、単に、\r\n`/aaa((.+))/g` だと、`aaa(` と `)` に囲まれた文字は何でもよく、つまり `)`でもよいことになります。これに加えて、`+` や `*` はなるべく長い部分でマッチさせるので、`paragraph` に含まれる、最後の`)`でマッチすることになり、対になる`)`までの部分とマッチしてくれへんのや。そこでどうするかゆうたら、`+` や `*` の後に `?` を付けると、なるべく短くマッチしてくれるようになるねん。\r\n\r\nつまり、こないな正規表現\r\n```javascript\r\nconst regex = /aaa((.+?))/g;\r\n```\r\nにしても、うまくいくで ➡ [サンプル](https://codepen.io/i8086x/pen/zYzJWwY?editors=0012)","dateModified":"2021-09-24T01:47:57.273Z","datePublished":"2021-09-23T18:37:44.540Z","upvoteCount":0,"url":"https://teratail.com/questions/361033#reply-491832","comment":[]},{"@type":"Answer","text":"いろいろ間違ってますね。\r\n\r\n* 括弧記号はメタ文字なので、括弧そのものを示すには\\によるエスケープが必要。\r\n* *は量指定子。直前の要素のゼロ回以上の繰り返しを意味する。コマンドラインでファイルを指定するときに使うワイルドカードとは違う。質問にあるのは「直前の要素」が欠けているのでNG。ここでは「閉じ括弧以外の文字」を「直前の要素」として指定するべきだろう。\r\n* パターンマッチングはaaaから始まるパターンである必要がありそうだが、得たいのは括弧の中身ということなので、サブパターンの指定が必要。\r\n\r\n\r\n```\r\np=\"ccc(d2nb1) aaa(b1d2) bbb(d2nb1)\";\r\nalert(p.match(/aaa(([^)]*))/)[1]);\r\n```","dateModified":"2021-09-23T18:36:22.798Z","datePublished":"2021-09-23T18:36:22.798Z","upvoteCount":0,"url":"https://teratail.com/questions/361033#reply-491831","comment":[]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"JavaScriptに関する質問","url":"https://teratail.com/tags/JavaScript"},{"@type":"ListItem","position":3,"name":"JavaScript","url":"https://teratail.com/tags/JavaScript"}]}}}
質問するログイン新規登録
JavaScript

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

Q&A

4回答

929閲覧

JavaScript 正規表現

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2021/09/23 17:22

0

0

正規表現を使いマッチした文字を取得したいです
aaaを指定してaaaの(*)かっこの中身を表示したいです
マッチの条件は()の中身の文字全てという形にしたいのですがどのようにしたらいいでしょうか

<script> window.onload=function(){ const paragraph="ccc(d2nb1) aaa(b1d2) bbb(d2nb1)"; const regex = /aaa(*)/g; const found = .match(regex); alert(found);//b1d2と出したい } </script>

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

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

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

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

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

guest

回答4

0

先読み言明、後読み言明を使うといいでしょう。

言明 - JavaScript | MDN

これらは特定の「位置」にマッチする正規表現です。
たとえば (?=aaa)aaa の直前にマッチし、(?<=aaa)aaa の直後にマッチします。

つまり aaa( の直後から ) の直前までの .*(0 個以上の任意の文字) を検索すればいいわけですが、単純に .* と書いてしまうと、最長一致の法則によりたとえば aaa(bbb) ccc(ddd) であれば最後の閉じカッコの直前までの bbb) ccc(ddd にマッチしてしまいます。
これを防ぐために .* ではなく .*? あるいは [^)]* と書けば、最初の閉じカッコの直前までにマッチします。

javascript

1const regex = /(?<=aaa().*?(?=))/g; 2const founds = paragraph.match(regex); 3alert(founds[0]);

founds には配列が入るので、そのうち最初の要素を取り出したい時には上記のように founds[0] を使います。

投稿2021/09/24 00:36

編集2021/09/24 02:08
Zuishin

総合スコア28675

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

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

Zuishin

2021/10/12 05:28

質問者凍結。無言だと思ったらやっぱり例のやつだったか。
guest

0

マッチの条件は()の中身の文字全てという形

としているのに

b1d2と出したい

というのは、命題がぶれています。
複数あった場合すべて出すなら戻り値は配列にしてください
文字列を返すならすべてではなく最初の1つだけ返してください

javascript

1const paragraph="ccc(d2nb1) aaa(b1d2) bbb(d2nb1)"; 2const regex = /(?<=aaa().+?(?=))/; 3const found = paragraph.match(regex)[0]; 4console.log(found);

投稿2021/09/24 00:18

yambejp

総合スコア118164

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

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

0

質問に

const regex = /aaa(*)/g;

とありよって、正規表現にg フラグがあるゆうことは、aaa(b1d2)みたいな aaaのやつは、 paragraph ん中に複数出てくることがあって、それらの全部について、丸カッコの中だけ取ってきたいゆう話やと思うたで。それやったら、こない

javascript

1const regex = /aaa(([^)]+))/g; 2const found = Array.from(paragraph.matchAll(regex), m => m[1]);

な感じかのう ➡ サンプル

追記:

最短マッチ を使う方法もあるで。上のコードでは、/aaa(([^)]+))/g としていて、これの中にある [^)]+ は、「)ではない文字の1つ以上の連続」を表して、この「)ではない文字」という指定をせずに、単に、
/aaa((.+))/g だと、aaa() に囲まれた文字は何でもよく、つまり )でもよいことになります。これに加えて、+* はなるべく長い部分でマッチさせるので、paragraph に含まれる、最後の)でマッチすることになり、対になる)までの部分とマッチしてくれへんのや。そこでどうするかゆうたら、+* の後に ? を付けると、なるべく短くマッチしてくれるようになるねん。

つまり、こないな正規表現

javascript

1const regex = /aaa((.+?))/g;

にしても、うまくいくで ➡ サンプル

投稿2021/09/23 18:37

編集2021/09/24 01:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

いろいろ間違ってますね。

  • 括弧記号はメタ文字なので、括弧そのものを示すには\によるエスケープが必要。
  • *は量指定子。直前の要素のゼロ回以上の繰り返しを意味する。コマンドラインでファイルを指定するときに使うワイルドカードとは違う。質問にあるのは「直前の要素」が欠けているのでNG。ここでは「閉じ括弧以外の文字」を「直前の要素」として指定するべきだろう。
  • パターンマッチングはaaaから始まるパターンである必要がありそうだが、得たいのは括弧の中身ということなので、サブパターンの指定が必要。
p="ccc(d2nb1) aaa(b1d2) bbb(d2nb1)"; alert(p.match(/aaa(([^)]*))/)[1]);

投稿2021/09/23 18:36

KojiDoi

総合スコア13727

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問