77461


下記の例で qiitaId の `''` にIdを入れたくて正規表現の `{}` に囲われた部分を置換したいのですが上手くマッチしないです。

対象の文字を `qiitaId:` の `''` この部分だけにしてそれを `1hhss11` に置換したいです。

正規表現に詳しい方教えて頂けないでしょうか?  
よろしくお願いします。

[code]

    const input = `---
    title: "Django公式チュートリアル（1~4）で分からない所、徹底的に調べた。" # 記事のタイトル
    emoji: "" # アイキャッチとして使われる絵文字（1文字だけ）
    type: "tech" # tech: 技術記事 / idea: アイデア記事
    topics: ["django", "python"] # タグ。["markdown", "rust", "aws"]のように指定する
    published: false # 公開設定（falseにすると下書き）
    date: '2021.05.25'
    qiitaId: '' #記事のslug
    ---
    ...マークダウンテキスト
    `
    
    const output = input.replace(/---[\s\S]*?qiitaId: {\'\'} [\s\S]*?---/, '1hhss11')
    console.log(output)
    
[/code]

追記  
`{}` については下記のコードで使用されていたので似た感じの使い方がしたくて使用しました。

[code]

    const input = "As I was going to Saint Ives"
    const output = input.replace(/\w{4,}/ig, '****');
    console.log(output);
    
[/code]

参照  
[苦手なJavaScriptで大嫌いな正規表現を克服する為のまとめ](https://zenn.dev/unemployed/articles/cab5a35f1a990e#%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%A7%E3%81%AE%E7%BD%AE%E6%8F%9B)


CC BY-SA 4.0
2021-06-10T03:01:29.333
77450
2021-06-10T09:02:15.030
2021-06-10T05:00:01.203
22565
22565
question
javascript 正規表現
JavaScript の正規表現でマッチした一部の文字列を置換したい


`replace`している行を下記のように書き換えると目的を達成できるかと思います。

[code]

    //const output = input.replace(/---[\s\S]*?qiitaId: {\'\'} [\s\S]*?---/, '1hhss11')
    const output = input.replace(/(---[\s\S]*?qiitaId: )'{2}( [\s\S]*?---)/, '$11hhss11$2')
    
[/code]

なお`\w{4,}`の意味は「任意の文字列が4文字以上連続している」の意味です。  
これを`'{2}`に書き直すことで「'(クォーテーション)が2文字連続している」の意味に変えています。

* * *

`$1`と`$2`は正規表現にマッチする範囲のうち括弧で[グループ化](https://web-
tsuku.life/replace-1-2-regrex/)された範囲に置き換えられます。  
そのため括弧で括る範囲に`'`を広げることで`$1`によりグループ化した内容に`'`も含められます。  
試しに`$1`や`$2`を削除してみると理解しやすいかもしれません。

なおqiitaidが最初に使われている箇所について、qiitaId: ''のクォーテーション内部を書き換える正規表現は下記のように記述可能です。

[code]

    let output = input.replace(/(qiitaId: *')[^\']*/, '$11hhss11');
    
[/code]


CC BY-SA 4.0
2021-06-10T04:14:25.163
77453
2021-06-10T05:53:30.593
2021-06-10T05:53:30.593
9820
9820
77450
answer


> qiitaIdがメタ情報以外の別で使用された場合にも対応したいと思い `---[\s\S]*?`
> を使用しました。それでも上から見ていって最初にマッチする qiitaIdなので可能性としてかなり低いので確かに必要ないかもしれないです。

先読み(look-ahead)と後読み(look-behind)を使って以下の様に書くことができます。

[code]

    input.replace(
      /(?<=---[\s\S]*?\nqiitaId:\s*').*?(?='[\s\S]*?---)/,
      '1hhss11');
    
[/code]

※ ブラウザによっては RegExp engine が後読みに対応していないかもしれません。少なくとも2017年以降で V8
を搭載しているブラウザ(Chrome, Firefox)であれば問題ありません。


CC BY-SA 4.0
2021-06-10T09:02:15.030
77461
2021-06-10T09:02:15.030
77450
answer