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

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

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

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

Q&A

解決済

4回答

3186閲覧

JavaScript:"特定の値を持つ文字列のみ"、配列に格納したい。

mie.8

総合スコア28

JavaScript

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

1グッド

0クリップ

投稿2017/05/25 06:16

編集2017/05/25 06:41

前提・実現したい事

あるサイトにJavaScriptを実装して、メールアドレスのドメイン("@"以降)を取得するプログラムを組んでいます。
そこで、対象のテキストからドメインを取得しようとしておりますが、上手く行かず困っております。
入力規則(複数のアドレスを入力する際)は、「, or ;」で区切るようにしています。

対象テキストは、「複数行テキスト(Note)(リッチテキスト無し)」になります。

############################################################
【(例)取得元テキスト】
Ritchie_Blackmore@111,eric_clapton@111;jimmy-page@111;,;
marty.friedman@222,you@2
2
2;jeff beck@22
2
,
slash@333;;Dimebag-Darrell@444,jhfjd;gfs1350
,123@555;123@555;000@555,555nyoe--;
@666,;@777;
AKIRA_TAKASAKI@888,
,
,
SUGIZO@999;char@101010
;
Nuno-Bettencourt@docomo.ne.jp,Sam-
Totman@softbank.ne.jp;
syu
@ezweb
.ne
.jp
;kiko.loureiro@yahoo.co.jp;paul.gilbert@gmail.com


【実行結果】
@111,
@222,
@333,
@444,
@555,
@666,
@777,
@888,
@999,
@101010,
@docomo.ne.jp,
@softbank.ne.jp,
@ezweb.ne.jp,
@yahoo.co.jp,
@gmail.com
############################################################

発生している問題・Error Message

【実装出来た事】
・対象テキストから値取得
・"@"以降のドメイン取得し、配列格納
・不要スペース削除

*「不要スペース削除」は、取得元テキストに改行が入っていると、
値を取得した際に、**『スペース』**に置き換わってしまうので実装しました。

【実装出来ない事】
・"@"を含む、ドメインのみ配列格納

実際のソースコード

javascript

1 2/************************************************************/ 3// ボタンが押されたら実行 4/************************************************************/ 5function Huton_Ga_Hutton_Da() { 6 7 /************************************************************/ 8 // 変数宣言 9 /************************************************************/ 10 var sarch = "@"; // 検索対象文字 11 var id = "TextArea_xxxx_xxxx_xxxx_$TextField"; // 取得対象テキストID 12 var split = /,|;/; // 分割対象文字 13 14 /************************************************************/ 15 // 取得処理開始!!! 16 /************************************************************/ 17 18 /* 1. 対象テキストから、値を取得し分割 */ 19 var text = document.getElementById(id).value; // テキストボックスから、値を取得 20 var domain = text.split(split); // 取得した値を、分割し配列へ格納 21 22 /* 2. 格納した文字列の修整 */ 23 for (var i = 0; i < domain.length; i++) { // LOOP 24 domain[i] = domain[i].replace(/\s+/g, ""); // 不要スペース削除 25 26 /* 3. "@" ドメイン取得 */ 27 if (domain[i].indexOf(sarch) >= 0) { // 配列検索 : "@" 28 domain[i] = domain[i].substring(domain[i].indexOf(sarch)); // "@"以降取得 29 } 30 } 31 32 /* 4. 重複Check */ 33 var modifyDomain = domain.filter(function(x, z, self) { // 重複Check 34 return self.indexOf(x) === z; // 重複データ削除 35 }); 36 37 /************************************************************/ 38 // 出力! 39 /************************************************************/ 40 alert(modifyDomain.toString()); 41} 42

最後に、ちゃんと取得出来たか確認の為、アラートにて表示させております。

上記ソースコードだと、配列の中には「"@"以外の物」まで格納されている状態です。

"@"のみの処理を行いたい場合、出力の所を下記コードに書き換えれば、出来るとは思うのですが
コードを見ていて、不格好だな~・・・と思いまして。。。

javascript

1/************************************************************/ 2// "@"のみ、処理を行いたい! 3/************************************************************/ 4 for (var j = 0; j < modifyDomain.length; j++) { // "modifyDomain" の、配列数分ループ処理 5 if (modifyDomain[j].indexOf(search) >= 0) { // 要素に "@" を含む物だけ登録 6 alert(modifyDomain[j]); 7 8 // ~~ "@"(ドメイン)のみを使う、その後の処理 ~~ 9 } 10}

試した事

そこで、/* 3. "@" ドメイン取得 */ の所を、変更しました。

javascript

1/************************************************************/ 2// ボタンが押されたら実行 -- 修正したが、ERROR出る(TдT) -- 3/************************************************************/ 4function Huton_Ga_Hutton_Da() { 5 6 /************************************************************/ 7 // 変数宣言 8 /************************************************************/ 9 var sarch = "@"; // 検索対象文字 10 var id = "TextArea_xxxx_xxxx_xxxx_$TextField"; // 取得対象テキストID 11 var split = /,|;/; // 分割対象文字 12 var c = 0; // カウンタ(初期化) ★New 13 var newDomain = ""; // "@"(ドメイン)のみ格納用配列 ★New 14 15 /************************************************************/ 16 // 取得処理開始!!! 17 /************************************************************/ 18 19 /* 1. 対象テキストから、値を取得し分割 */ 20 var text = document.getElementById(id).value; // テキストボックスから、値を取得 21 var domain = text.split(split); // 取得した値を、分割し配列へ格納 22 23 /* 2. 格納した文字列の修整 */ 24 for (var i = 0; i < domain.length; i++) { // LOOP 25 domain[i] = domain[i].replace(/\s+/g, ""); // 不要スペース削除 26 27 /* 3. "@" ドメイン取得 */ 28 if (domain[i].indexOf(sarch) >= 0) { // 配列検索 : "@" 29 newDomain[c] = domain[i].substring(domain[i].indexOf(sarch)); // "@"以降取得 ★New 30 c++; // カウントアップ ★New 31 } 32 } 33 34 /* 4. 重複Check */ 35 var modifyDomain = newDomain.filter(function(x, z, self) { // 重複Check 36 return self.indexOf(x) === z; // 重複データ削除 37 }); 38 39 /************************************************************/ 40 // 出力! 41 /************************************************************/ 42 alert(modifyDomain.toString()); 43}

自分の考えでは、【/* 3. "@" ドメイン取得 */】の、"if文"の箇所で、格納出来ないかと考えました。
1."@"ドメインのみ格納する「配列:newDomain」を宣言。
2.「配列:newDomain」の『添字用配列:c』を宣言。
3.『添字用配列:c』のカウントアップの為、"c++;"を追記。


実行すると、『変数:c が宣言されていません。」と出てしまい、if文の所でエラーになります。
Function内で変数宣言している為、参照出来るとは思うのですが・・・
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
①長くなりましたが、配列の添字用に変数を宣言しても使用出来ないという事でしょうか?
②配列の添字は、"for文"のように、ループ処理内でしかカウントアップ出来ないものですか?
③元のテキストから、"@"ドメインのみ配列に取得する良い方法があれば、ご教示頂ければと思います。
よろしくお願い致します。

補足情報(言語/FW/ツール等のVersion)

・言語:JavaScript

m.ts10806👍を押しています

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

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

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

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

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

kei344

2017/05/25 06:21

どういった文章(テキスト)から取得するかと、その結果ほしいデータを提示してください。
mie.8

2017/05/25 06:43

ご回答ありがとうございます。取得元テキスト例・実行結果例を掲載しました。よろしくお願い致します。
mie.8

2017/05/25 07:15

申し訳ございません。解決致しました。 原因は、「解決したい事」に記載したコード中の、「c++;」の所でした。 入力時は確かに、「半角小文字の"c"」を入力しましたが、エラー後のコードを確認すると 『半角大文字の"C"』になっておりました。 自分の使っているエディターの使用で、英字1文字だけだと大文字になってしまうんでしょうか・・・? ちなみに、使っているエディターは「sublime text 3」です。 ご回答して頂き、ありがとうございました。
kei344

2017/05/25 10:33

ここは「質問への追記・修正、ベストアンサー選択の依頼」ですので、「回答」ではありません。解決されたようでよかったです。
guest

回答4

0

ドメイン名の正規表現を厳密にすれば、String#split せずとも実装できそうです。

JavaScript

1var string = `Ritchie_Blackmore@111,eric_clapton@111;jimmy-page@111;,; 2marty.friedman@222,you@2 32 42;jeff beck@22 52 6, 7slash@333;;Dimebag-Darrell@444,jhfjd;gfs1350 8,123@555;123@555;000@555,555nyoe--; 9@666,;@777; 10AKIRA_TAKASAKI@888, 11, 12, 13SUGIZO@999;char@101010 14; 15Nuno-Bettencourt@docomo.ne.jp,Sam- 16Totman@softbank.ne.jp; 17syu 18@ezweb 19.ne 20.jp 21;kiko.loureiro@yahoo.co.jp;paul.gilbert@gmail.com`; 22 23var domains = string.replace(/\s+/g, '').match(/@\w+(?:\.\w+)+/g); 24 25console.log(domains); // ["@docomo.ne.jp", "@softbank.ne.jp", "@ezweb.ne.jp", "@yahoo.co.jp", "@gmail.com"]

Re: mie.8 さん

投稿2017/05/25 07:26

think49

総合スコア18156

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

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

mie.8

2017/05/25 07:32

ご回答ありがとうございます。
guest

0

javascript

1var newDomain = [];

配列の宣言にしたところ、@の後ろを格納しました。
傷の浅いうちに、sarch をsearchにすることをお勧めします。

投稿2017/05/25 06:34

namimon

総合スコア726

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

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

mie.8

2017/05/25 06:48

実行しアラート表示させた所、「-1」と表示されてしまいました。 誤字、すみませんでした。 ご回答、ありがとうございます。
mie.8

2017/05/25 07:15

申し訳ございません。解決致しました。 原因は、「解決したい事」に記載したコード中の、「c++;」の所でした。 入力時は確かに、「半角小文字の"c"」を入力しましたが、エラー後のコードを確認すると 『半角大文字の"C"』になっておりました。 自分の使っているエディターの使用で、英字1文字だけだと大文字になってしまうんでしょうか・・・? ちなみに、使っているエディターは「sublime text 3」です。 ご回答して頂き、ありがとうございました。
guest

0

自己解決

申し訳ございません。解決致しました。
原因は、「解決したい事」に記載したコード中の、「c++;」の所でした。
入力時は確かに、「半角小文字の"c"」を入力しましたが、エラー後のコードを確認すると
『半角大文字の"C"』になっておりました。
ご回答して頂き、ありがとうございました。

投稿2017/05/25 07:31

mie.8

総合スコア28

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

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

0

こんなかんじでしょうか?

javascript

1var str="123,abc;456@hoge,xyz@fuga"; 2var a=[]; 3str.split(/[,;]/).filter(function(x){ 4 return x.match(/@/); 5}).forEach(function(x){ 6 a.push(x.match(/@(.+?)$/)[1]); 7}); 8console.log(a); 9

追記

例示のデータを元に@つきでユニークなドメイン名を取得します

javascript

1//ヒアドキュメント風処理 2var str=(function() { 3/* 4Ritchie_Blackmore@111,eric_clapton@111;jimmy-page@111;,; 5marty.friedman@222,you@2 62 72;jeff beck@22 82 9, 10slash@333;;Dimebag-Darrell@444,jhfjd;gfs1350 11,123@555;123@555;000@555,555nyoe--; 12@666,;@777; 13AKIRA_TAKASAKI@888, 14, 15, 16SUGIZO@999;char@101010 17; 18Nuno-Bettencourt@docomo.ne.jp,Sam- 19Totman@softbank.ne.jp; 20syu 21@ezweb 22.ne 23.jp 24;kiko.loureiro@yahoo.co.jp;paul.gilbert@gmail.com 25*/ 26}).toString().replace(/\r\n|\r|\n/g,'__rn__').match(/\/\*(.+)\*\//)[1].replace(/__rn__/g,"\n"); 27//一旦表示 28console.log(str); 29 30var a=[]; 31str.split(/[,;\r\n]/).filter(function(x){ 32 return x.match(/@/); 33}).forEach(function(x){ 34 a.push(x.match(/@.+?$/)[0]); 35}); 36//aをユニークに 37a=a.filter(function (x,y,z) { 38 return z.indexOf(x) === y; 39}); 40console.log(a);

投稿2017/05/25 06:46

編集2017/05/25 07:02
yambejp

総合スコア114581

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

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

mie.8

2017/05/25 07:02

ご回答ありがとうございます。 上記コードを試してみましたが、表示されませんでした。
yambejp

2017/05/25 07:05 編集

サンプル追加しときました コピペするだけでご希望の結果がコンソールに表示されると 思いますが?ブラウザ上に表示したい?
mie.8

2017/05/25 07:15

申し訳ございません。解決致しました。 原因は、「解決したい事」に記載したコード中の、「c++;」の所でした。 入力時は確かに、「半角小文字の"c"」を入力しましたが、エラー後のコードを確認すると 『半角大文字の"C"』になっておりました。 自分の使っているエディターの使用で、英字1文字だけだと大文字になってしまうんでしょうか・・・? ちなみに、使っているエディターは「sublime text 3」です。 ご回答して頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問