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

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

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

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

正規表現

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

Q&A

4回答

487閲覧

【javascript】正規表現に詳しい方お願いします!

Zoohomi

総合スコア26

JavaScript

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

正規表現

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

0グッド

0クリップ

投稿2017/11/16 13:59

javascriptの正規表現について質問です。

javascriptっていっても、使用言語はgasなのですが・・・

var data = UrlFetchApp.fetch(url); var strText = data.getContentText();

というコードで、変数strTextにhtmlを取得しています。

その内容が以下とします。
この際に、
"classが「A」かつ、「data=B」が付いていないDIVのouterHTML"を配列に格納したいのです。

html

1<div class="A" data="B"> 2 <div class="C"> 3 <div class="D"> 4 <a href="/">×外側のクラスはAですが、data=Bが入っているので取得しません</a> 5 </div> 6 </div> 7</div> 8<div class="A"> 9 <div class="C"> 10 <div class="D"> 11 <a href="/">取得します!!</a> 12 </div> 13 </div> 14</div> 15<div class="ZZZZZZZZZZ"> 16 <div class="C"> 17 <div class="D"> 18 <a href="/">×外側のクラスがZZZZZZZZZなので取得しません</a> 19 </div> 20 </div> 21</div> 22<div class="A"> 23 <div class="C"> 24 <div class="D"> 25 <a href="/">取得します!!</a> 26 </div> 27 </div> 28</div> 29<div class="A" data="B"> 30 <div class="C"> 31 <div class="D"> 32 <a href="/">×外側のクラスはAですが、data=Bが入っているので取得しません</a> 33 </div> 34 </div> 35</div>

つまり、

javascript

1var aryMatch = strText.match(【正規表現】); 2// aryMatchの内容 3// [ 4// "<div class="A"> 5// <div class="C"> 6// <div class="D"> 7// <a href="/">取得します!!</a> 8// </div> 9// </div> 10// </div>" 11// , 12// "<div class="A"> 13// <div class="C"> 14// <div class="D"> 15// <a href="/">取得します!!</a> 16// </div> 17// </div> 18// </div>" 19// ]

となるようにしたいのです。

正規表現に詳しい方、宜しくお願いいたします。

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

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

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

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

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

guest

回答4

0

正規表現ではなくDOMをパースしたほうが確実な気がします。
(最近使っていないので下記記事が今も使えるかはわかりませんが)

【[GAS]HTML/XMLをパースする · ENTRYPOINT】
https://yhirano55.github.io/2015/10/01/6653458415123214142/

【XML Service Service  |  Apps Script  |  Google Developers】
https://developers.google.com/apps-script/reference/xml-service/

投稿2017/11/17 03:23

kei344

総合スコア69407

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

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

0

根本的に、HTMLのような「ネストしうるものに対して正規表現でマッチングを行う」というのが向いていません。

そのようなマッチングをさせようとしたら、処理系ごとの独自拡張に頼る必要があるのですが、JavaScriptの「後方参照」だけでそのようなものを書けるかは、よくわかりませんし、仮に書けたとしても読解が困難なものとなります。

投稿2017/11/16 23:35

編集2017/11/17 00:12
maisumakun

総合スコア145184

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

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

0

javascript

1window.addEventListener('DOMContentLoaded', function(){ 2 Array.prototype.map.call(document.querySelectorAll('.A:not([data=B]'),function(x){ 3 console.log(x.outerHTML); 4 }) 5});

追記

文字列から取得

javascript

1var strText=` 2<div class="A" data="B"> 3 <div class="C"> 4 <div class="D"> 5 <a href="/">×外側のクラスはAですが、data=Bが入っているので取得しません</a> 6 </div> 7 </div> 8</div> 9<div class="A"> 10 <div class="C"> 11 <div class="D"> 12 <a href="/">取得します!!1</a> 13 </div> 14 </div> 15</div> 16<div class="ZZZZZZZZZZ"> 17 <div class="C"> 18 <div class="D"> 19 <a href="/">×外側のクラスがZZZZZZZZZなので取得しません</a> 20 </div> 21 </div> 22</div> 23<div class="A"> 24 <div class="C"> 25 <div class="D"> 26 <a href="/">取得します!!2</a> 27 </div> 28 </div> 29</div> 30<div class="A" data="B"> 31 <div class="C"> 32 <div class="D"> 33 <a href="/">×外側のクラスはAですが、data=Bが入っているので取得しません</a> 34 </div> 35 </div> 36</div> 37`; 38$(strText).filter('.A:not([data=B])').each(function(){ 39 console.log($(this).prop('outerHTML')); 40}); 41

投稿2017/11/16 14:18

編集2017/11/17 00:30
yambejp

総合スコア114843

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

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

Zoohomi

2017/11/16 14:36

さっそくのご回答ありがとうございます! すみません、使用言語はgasなので、 var aryMatch = strText.match(【正規表現】); で取れるようにはできますでしょうか?
yambejp

2017/11/17 00:31

文字列から取得したいのですね それでも正規表現は使う処理ではないです
guest

0

正規表現

まず、正規表現でHTMLタグを抽出する事は不可能ではありません。
JavaScriptにおいては、ネストされたタグの対応関係を知るために 、RegExp#execもしくはString#replace` を利用する事になります。
https://teratail.com/questions/75922
https://gist.github.com/think49/53b4a2cedfcff3c1a1ea40390a7ff3d8

githubの readme.md より <div></div> を抽出する手法を参考にして下さい。
そして、開始タグより classが「A」かつ、「data=B」が付いていない、タグを絞り込んで下さい。
ただし、find-corresponding-from-string.js では「開始タグ」「終了タグ」しか抽出しない為、「開始タグから終了タグまでの文字列全体」も抽出するように処理を書き換えてやる必要があります。

DOM API

JavaScriptでは、HTMLタグはDOMオブジェクトに変換して処理する方が容易に処理出来るよう設計されています。

  • DOMParser
  • innerHTML
  • insertAdjacentHTML
  • createHTMLDocument

jQueryならこちら。

  • jQuery()
  • .html()

「DOM/jQueryオブジェクトに変換→innerHTML等で文字列出力」という手順で要件を達成するわけですが、その場合はDOMに変換される過程出元の文字列が失われ、抽出する文字列 元々の文字列に相違が出る可能性があります。
基本的にDOM的に同一でるなら、同一と見なすべきですが、何がしかの事情出対応出来ないのであれば、正規表現で実装する意味はあります。

Re: Zoohomi さん

投稿2017/11/17 03:56

think49

総合スコア18164

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

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

kei344

2017/11/17 04:09

To: think49さん Google Apps Script に DOMParser は実装されていません。(HTMLというかUIを出力/表示したあとはブラウザなので使えます)
think49

2017/11/17 08:34

To: kei344 さん なるほど、Google Apps Script はDOM API全般をサポートしていないサーバサイド言語なんですね。 そうなると、自前実装なら、正規表現で実装する手段しか思いつきませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問