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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

6回答

415閲覧

正規表現について置換した文字が、次の置換対象とかぶる場合はどうすればいいですか?

退会済みユーザー

退会済みユーザー

総合スコア0

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

0クリップ

投稿2018/08/23 19:26

原因はabString = abString.replace()だろうなと思っていますが、具体的な改善策がわかりません。
下のコードは自分が今起きている問題を簡単に表したものです。aとbを反転させようとしています。

javascript

1var abString = "aabb abab"; //この文字列を置換してbbaa babaにすることが目標です 2var searchList = ["a", "b"]; //このリストに入っている文字を検索します 3searchList.forEach(function(val) { 4 var regexp = new RegExp(val, "g"); 5 console.log(val, regexp, abString) 6 if (abString.match(regexp)) { 7 var hitList = abString.match(regexp); 8 for (var a = 0; a < hitList.length; a++) { 9 if (val == "a") { 10 abString = abString.replace(val, "b"); 11 } else { 12 abString = abString.replace(val, "a"); 13 } 14 } 15 } 16}); 17console.log(abString); //aaaa aaaaと表示されます。

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

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

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

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

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

guest

回答6

0

ベストアンサー

replaceのコールバックを取って、表引きにしましょう(MDN)。一気に置換すれば、置換前と置換後が重複していても無関係です。

javascript

1var replaceTable={a: 'b', b: 'a'} 2 3'abbcbba'.replace(/[ab]/g, (str) => replaceTable[str]); 4// 結果は'baacaab'

投稿2018/08/24 00:24

maisumakun

総合スコア145121

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

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

m.ts10806

2018/08/24 01:24

本来は沢山対称文字列があるようなのでやはり置換リンクテーブルのようなものは必要ですね。
guest

0

未検証。

JavaScript

1'aaabbb'.replace(/[ab]/g, funcction (char) { 2 return this[char]; 3}.bind({a:'b', b:'a'}));

Re: teratailpeta さん

投稿2018/08/24 00:23

編集2018/08/24 03:39
think49

総合スコア18156

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

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

0

val=="a"という判定が直で入っているのでどの文字がどの文字にって固定なんですよね?
1文字ずつ取り出せばreplaceなくても実現は可能です。※あくまでやり方の一つとして

js

1var abString = "aabb abab"; 2var searchList = ["a", "b"]; 3var replaceAbString = ""; 4for(i=0;i<abString.length;i++){ 5 if(searchList.indexOf(abString[i])>=0){ 6 if(abString[i] == "a"){ 7 replaceAbString += "b"; 8 }else{ 9 replaceAbString += "a"; 10 } 11 }else{ 12 replaceAbString += abString[i]; 13 } 14} 15 16console.log(replaceAbString); //bbaa baba

この文字がこの文字にって変換リストの形式にした方が汎用性は高いかもしれませんね。

js

1var searchList = {"a":"b", "b":"a"}; 2//このあとの処理は少し変わりますが、replaceは不要です

投稿2018/08/23 23:32

m.ts10806

総合スコア80765

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

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

0

案1:
置換対象に関数を指定する。

案2:
一旦別の文字に置換する。つまり、置換を3回行う。

JavaScript

1var out1 = abString.replace(new RegExp(searchList.join("|"),"g"), 2 function(m){ 3 return m==searchList[0] ? 4 searchList[1] : 5 searchList[0]; 6 } 7) 8 9var out2 = abString.replace(new RegExp(searchList[0],"g"), "\0") 10 .replace(new RegExp(searchList[1],"g"), searchList[0]) 11 .replace(/\0/g, searchList[1]);

投稿2018/08/24 00:21

otn

総合スコア84421

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

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

otn

2018/08/24 00:41

searchListが外部から与えられる前提で書くと↑のようにめんどくさいです。 a b が固定で、リテラル埋め込みで良いならもっとすっきり書けます。
guest

0

aabb abab
↓ a を b に置換
bbbb bbbb
↓ b を a に置換
aaaa aaaa

そりゃ当然こうなりますよね。
例として提示されているだけで、本来置換したい文字列がわからないのでなんとも言えないですが、いったんまったく関係ない別の記号に置き換える方法が理解しやすいのではないかなと思います。

aabb abab
↓ a を % に置換 % = b と記憶しておく
%%bb %b%b
↓ b を # に置換 # = a と記憶しておく
%%## %#%#
↓ % を b に置換
bb## b#b#
↓ # を a に置換
bbaa baba

他にももっとスマートなやり方はあると思いますが。

投稿2018/08/23 22:02

spookybird

総合スコア1803

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

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

0

JavaScriptなど不要。そう、シェル芸ならね!

bash

1$ echo 'aabb abab'|tr 'ab' 'ba' 2bbaa baba

投稿2018/08/23 19:54

hichon

総合スコア5737

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

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

退会済みユーザー

退会済みユーザー

2018/08/23 19:58

申し訳ないのですが。実際はabの文字列ではなく、もっと多くの種類の文字があり、それらの置換作業が互いに影響してしまっている状態です。それをそのまま質問するのは、煩雑になるのでabの文字列だけで表しました。
spookybird

2018/08/23 22:51

JavaScript タグをつけて JavaScript で実現しようとしている方に対してシェルで回答しても無意味では?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問