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

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

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

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

正規表現

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

TypeScript

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

Q&A

3回答

476閲覧

JavaScriptの正規表現について

letmedown

総合スコア0

JavaScript

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

正規表現

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

TypeScript

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

0グッド

1クリップ

投稿2020/05/26 13:38

前提・実現したいこと

否定後読みが使えない条件下で以下ソースの文字列から特定の場所にあるuserだけを置換したいと考えています。(コメント部分は本来無い物としてお考えいただけましたら幸いです)

JavaScriptを使って置換することは可能でしょうか?

ご教示いただけましたら幸いです。

該当のソースコード

js

1const text = ` 2 ユーザー名:user メールアドレス:test@mailcom // この行の`user`は置換する 3 <img alt="user" src="user.jpg" /> // この行は置換しない 4 <a href="/user.html" title="user">user</a> // この行のaタグで挟まれている`user`だけを置換する(href, titleの`user`は置換しない) 5 6 ユーザー名:user1 メールアドレス:test1@mailcom // この行の`user`だけを置換する(`1`は残したい) 7 <img alt="user1" src="user1.jpg" /> // この行は置換しない 8 <a href="/user1.html" title="user1">user1</a> // この行のaタグで挟まれている`user`だけを置換する(`1`は残し、href, titleの`user`は置換しない) 9`;

試したこと

否定後読みを使い正規表現で置換しようと考えていましたが、FireFoxで利用できなかった。

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

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

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

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

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

miyabi_takatsuk

2020/05/26 13:58

可能かどうかだけ回答すればよろしいでしょうか??
miyabi_takatsuk

2020/05/26 14:02

> 否定後読みを使い正規表現で置換しようと考えていましたが、FireFoxで利用できなかった。 これを実行した、自身のソースコードを記載お願いします。 現状の質問文ですと、可能かどうかだけわかればいいとなってしまっているのと、 その正規表現の方法まで聞きたいのであれば、 自身のコードを提示しないと、 丸投げの質問になってしまうかと思います。
guest

回答3

0

要件

「テキストノード値を置換したい」と受け取りました。

正規表現

複雑なHTMLに対して、正規表現は向いていません。

  • テキストノード値で <> がエスケープされている
  • HTMLタグは完全な形で文字列に格納されている(src="user"> のようなHTMLタグの部分文字列ではない)
  • 属性値で <> がエスケープされている
  • コメントで <> がエスケープされている
  • etc

の条件を揃えれば、テキストノードを判定することは可能ですが、DOM APIがより確実です.

XPath

XPathを使えば、比較的簡単にテキストノードを検索できます。

JavaScript

1'use strict'; 2const text = ` 3 ユーザー名:user メールアドレス:test@mailcom 4 <img alt="user" src="user.jpg" /> 5 <a href="/user.html" title="user">user</a> 6 `; 7const div = document.createElement('div'); 8 9div.innerHTML = text; 10const xpathResult = document.evaluate('descendant::text()[contains(.,"user")]', div, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 11 12for (let i = 0, len = xpathResult.snapshotLength; i < len; ++i) { 13 const textNode = xpathResult.snapshotItem(i); 14 textNode.data = textNode.data.replace(/user/g, 'replaced'); 15} 16 17console.log(div.innerHTML); 18/* 19" 20 ユーザー名:replaced メールアドレス:test@mailcom 21 <img alt="user" src="user.jpg"> 22 <a href="/user.html" title="user">replaced</a> 23 " 24*/

Re: letmedown さん

投稿2020/05/26 16:11

think49

総合スコア18189

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

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

0

こんにちは

否定後読み

を使える場合に比べて、コードの行数は増えますが、以下でどうでしょう?

javascript

1const text1 = text.replace(/["/]user/g, str => `${str[0]}_USER_`); 2const text2 = text1.replace(/user/g, 'hoge'); 3const text3 = text2.replace(/_USER_/g, 'user'); 4 5console.log(text3);

やっていることは以下です。

  • " または / の後にある user_USER_ に置き換え
  • userhoge に置き換え
  • _USER_user に戻す

参考になれば幸いです。

投稿2020/05/26 14:32

jun68ykt

総合スコア9058

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

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

0

FireFoxの管理ツールでざっと実行したら普通にできたけど違うんかな?
バージョンは76.0.1

javascript

1 2var a =`ユーザー名:user メールアドレス:test@mailcom 3<img alt="user" src="user.jpg" /> 4<a href="/user.html" title="user">user</a> 5 6ユーザー名:user1 メールアドレス:test1@mailcom 7<img alt="user1" src="user1.jpg" /> 8<a href="/user1.html" title="user1">user1</a>` 9 10a.replace(/(?!".*?)user(?!.*?")/g,'huga') 11

投稿2020/05/26 15:06

sousuke

総合スコア3830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問