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

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

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

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

Markdown

Markdownは、文書の構造、修飾情報を記述するための軽量マークアップ言語です。

Q&A

解決済

2回答

555閲覧

JavaScriptでテキスト中に含まれる特定文字の置換方法

jigu3638442

総合スコア2

JavaScript

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

Markdown

Markdownは、文書の構造、修飾情報を記述するための軽量マークアップ言語です。

0グッド

2クリップ

投稿2022/03/26 05:05

はじめまして、私はmarkdown記法をJavaScriptで自作しています。
ご相談として次のような文字列の置換実現したいです。

変換前

■ケース1 テキスト中に『**』が偶数個ある場合

  • txt1 = "あい**うえお**かきくけこ"

■ケース2 テキスト中に『**』が偶数個ある。さらに複数組の『**』が存在する場合

  • txt2 = "あい**うえお**かき**くけこ**" 

■ケース3『**』が奇数個しかない場合(このケースは置換されない)

  • txt3 = "あい**うえおかきくけこ" 

置換後

  • txt1 = "あい<em>うえお</em>かきくけこ"
  • txt2 = "あい<em>うえお</em>かき<em>くけこ</em>"
  • txt3 = "あい**うえおかきくけこ"

私が実施した方法として、まずmatchでテキスト中の『**』を一旦配列に抽出し、lengthで個数をカウントしました。

『**』が奇数個の場合は、置換をせずに出力しますので、txt3のケースは対応できました。

ケース1と2の対応はreplaceAll()を使い、実現しようと思いました。
私が書いたコードでは全ての『**』が<em>へ置換されてしまいます。

テキスト中の偶数番目だけ</em>へ置換する指定が記述できれば解決すると考えていますが、うまく書けていない状況です。

javascript

1txt.match(/\*\*/g).length % 2 === 1 2 ? `<p>${txt}</p>` 3 : `<p>${text.replaceAll(/\*\*/g, "<em>")}</p>`

上記のロジックに沿っていなくても大丈夫です。
解決策をアドバイスいただけると助かります。
よろしくお願いいたします。

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

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

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

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

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

oran

2022/03/26 06:08 編集

いったんすべて<em>に置換した後、何回「<em>」が出現するのかをカウントし、 <em>の個数分ループを回して、偶数回目のみ<em>を</em>に置換するのはどうでしょう。 何回<em>が出現したかカウントしたときに奇数だったら、上記コードの通りに何も置換しないようにすればよいかなと思いました。
guest

回答2

0

こちらでいかがでしょうか。

js

1const inputArray = [ 2 "あい**うえお**かきくけこ", 3 "あい**うえお**かき**くけこ**", 4 "あい**うえおかきくけこ", 5]; 6 7// partsjs/_includeCount.js at master · standard-software/partsjs 8// https://github.com/standard-software/partsjs/blob/master/source/string/_includeCount.js 9 10const _includeCount = (str, search) => { 11 let result = 0; 12 let index = 0; 13 do { 14 index = str.indexOf(search, index); 15 if (index === -1) { break; } 16 index += search.length; 17 result += 1; 18 } while (true); 19 return result; 20}; 21 22for (let txt of inputArray) { 23 const count = _includeCount(txt, '**'); 24 if (count % 2 === 1) { 25 continue; 26 } 27 for (let i = 0; i < count; i += 1) { 28 if (i % 2 === 0) { 29 txt = txt.replace('**', '<em>'); 30 } else { 31 txt = txt.replace('**', '</em>'); 32 } 33 } 34 console.log(txt); 35} 36// あい<em>うえお</em>かきくけこ 37// あい<em>うえお</em>かき<em>くけこ</em> 38

投稿2022/03/26 10:55

standard-soft

総合スコア197

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

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

jigu3638442

2022/03/26 11:42

解決案をご提案していただきありがとうございました。 関数型を優先して実装していたため、別の方をベストアンサーにさせていただきました。 できなかった場合、上記のロジックのような解決策を取り入れる予定でした。ありがとうございました。
standard-soft

2022/03/27 17:32

どういたしまして。 一応、こんな記事も最近かいたことがあるので、ご参考にでも。 「メンテできなくなるから複雑な正規表現は書かないでくれない?」正規表現を理解していない人に合わせろってことですか?に対する回答 - Quora https://qr.ae/pG0evw ベストアンサーじゃなかったから悔しくて....みたいなのではないんですが、いちおう。 sigurupoさんのコードは非常にかっこよくスッキリしていて、自分も勉強させていただいています。
guest

0

ベストアンサー

javascript

1const paragraph = 'あい**うえお**かきくけこ'; 2const regex = /\*\*([^\*]+)\*\*/g; 3const found = paragraph.replaceAll(regex, "<em>$1</em>"); 4 5console.log(found); 6}

生のテキストからhtmlの<>を抜き出す感じで作りました。

投稿2022/03/26 06:21

編集2022/03/26 06:32
sigurupo

総合スコア137

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

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

jigu3638442

2022/03/26 11:37

自分のやりたいことを表現してくれてありがとうございます。動作も想定通りでした。 上記の正規表現を調べ、やり方が理解できました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問