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

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

詳細はこちら
JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

3回答

1019閲覧

文字列を置換したいです

inukujira

総合スコア130

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2021/02/17 15:05

すみません、教えてください。
以下の文字列があります。

TypeScript

1value = "abc";

この文字列を以下のように置換したいです。

【求める実行結果】内容:aは<ab>で囲む、bは<bc>で囲む、cは<ca>で囲む

<ab>a<ab><bc>b<bc><ca>c<ca>

自分でやったことは以下のコードでreplace置換を繰り返したんですが、当然1回目の変換結果含めて2回目が走ってしまいうまく行きません..。

動作デモ - stackblitz

TypeScript

1import { Component } from "@angular/core"; 2 3@Component({ 4 selector: "my-app", 5 templateUrl: "./app.component.html", 6 styleUrls: ["./app.component.css"] 7}) 8export class AppComponent { 9 result: string; 10 value = "abc"; 11 12 ngOnInit() { 13 const query1 = "a"; 14 const query2 = "b"; 15 const query3 = "c"; 16 17 // 1回目の変換 18 const result1 = this.value.replace(new RegExp(query1, "gi"), match => { 19 return "<ab>" + match + "<ab>"; 20 }); 21 // 2回目の変換 22 const result2 = result1.replace(new RegExp(query2, "gi"), match => { 23 return "<bc>" + match + "<bc>"; 24 }); 25 // 3回目の変換 26 const result3 = result2.replace(new RegExp(query3, "gi"), match => { 27 return "<ca>" + match + "<ca>"; 28 }); 29 this.result = result3; 30 } 31}

どなたか良い方法あればご教示の程よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

Typescriptではなく、Javascriptでの回答になりますが

Javascript

1const value = "abc"; 2const dictionary = 3{ 4 a:"<ab>", 5 b:"<bc>", 6 c:"<ca>" 7}; 8const keys = Object.keys(dictionary).sort((a,b)=>b.length-a.length||a>b); 9const pattern = new RegExp(keys.join("|"),"gi"); 10const result = value.replace(pattern,m=>`${dictionary[m.toLowerCase()]}${m}${dictionary[m.toLowerCase()]}`); 11console.log(result);

念の為、変換の対象が増えたり2文字以上になっても対応できるようにしてあります。
こんなんでどうでしょう。

※追記
HTMLのタグ風にしたいなら、こんな感じです。

javascript

1const value = "abc"; 2const dictionary = 3{ 4 a:"ab", 5 b:"bc", 6 c:"ca" 7}; 8const keys = Object.keys(dictionary).sort((a,b)=>b.length-a.length||a>b); 9const pattern = new RegExp(keys.join("|"),"gi"); 10const result = value.replace(pattern,m=>`<${dictionary[m.toLowerCase()]}>${m}</${dictionary[m.toLowerCase()]}>`); 11console.log(result);

投稿2021/02/18 01:17

編集2021/02/18 06:57
AT_2nd

総合スコア266

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

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

inukujira

2021/02/18 06:46

ありがとうございます!!素晴らしいです!! すみません、1つ相談なんですがHTMLタグのように「<ab>a</ab>...」最後に/を入れたい場合はどのようにすれば良いでしょうか><;
inukujira

2021/02/19 05:26

ありがとうございました!!完璧でした!
guest

0

typescript

1export class AppComponent { 2 result: string = ""; 3 value = "abc"; 4 5 ngOnInit() { 6 const query1 = "a"; 7 const query2 = "b"; 8 const query3 = "c"; 9 10 // 1回目の変換 11 const result1 = this.value.replace(new RegExp(query1, "gi"), match => { 12 this.result += "<ab>" + match + "<ab>"; 13 return ""; 14 }); 15 // 2回目の変換 16 const result2 = result1.replace(new RegExp(query2, "gi"), match => { 17 this.result += "<bc>" + match + "<bc>"; 18 return ""; 19 }); 20 // 3回目の変換 21 const result3 = result2.replace(new RegExp(query3, "gi"), match => { 22 this.result += "<ca>" + match + "<ca>"; 23 return ""; 24 }); 25 // this.result = result3; 26 } 27}

投稿2021/02/17 23:47

gakuburu

総合スコア125

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

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

0

TypeScript

1let value = "abc"; 2 3const query1 = "a"; 4const query2 = "b"; 5const query3 = "c"; 6 7const array = value.split(""); 8const result: string = array.reduce((res: string, ch: string): string => { 9 if(ch==query1){ 10 return res+"<ab>" + ch + "<ab>"; 11 }else if(ch==query2){ 12 return res+"<bc>" + ch + "<bc>"; 13 }else if(ch==query3){ 14 return res+"<ca>" + ch + "<ca>"; 15 } 16 return res+ch; 17}, ""); 18console.log(result);

投稿2021/02/17 18:04

編集2021/02/17 18:12
modieu

総合スコア282

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問