JS регулярное выражение заменить матч в определенном абзаце - PullRequest
0 голосов
/ 17 октября 2018
---
title: test
date: 2018/10/17
description: some thing
---

Я хочу заменить то, что стоит за date, если оно находится между ---, в данном случае 2018/10/17.Как это сделать с помощью регулярного выражения в JS?

Пока что я пробовал;

/(?<=---\n)[\s\S]*date.+(?=\n)/ 

, но это работает только тогда, когда дата является первой строкой после ---

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Возможно, хотя imo не рекомендуется:

(^---)((?:(?!^---)[\s\S])+?^date:\s*)(.+)((?:(?!^---)[\s\S])+?)(^---)

Это необходимо заменить на $1$2substitution$4$5, см. демо на regex101.com .


В разбивке это читается
(^---)                    # capture --- -> group 1
(
    (?:(?!^---)[\s\S])+?  # capture anything not --- up to date:
    ^date:\s*
)
(.+)                      # capture anything after date
(
    (?:(?!^---)[\s\S])+?) # same pattern as above
(^---)                    # capture the "closing block"

Пожалуйста, рассмотрите возможность использования вышеупомянутого двухэтапного подхода, так как это регулярное выражение не будет читаемым через пару недель (а движок JS неподдержка подробного режима).

0 голосов
/ 17 октября 2018

Не используя позитивный взгляд сзади, вы можете использовать 2 группы захвата и использовать их в замене, например, $ 1 замещение $ 2

(^---[\s\S]+?date: )\d{4}\/\d{2}\/\d{2}([\s\S]+?^---)

Regex demo

Пояснение

  • ( Группа захвата
    • ^---[\s\S]+?date: Матч с начала строки 3 раза - с последующим совпадениемлюбой 0+ раз любой символ не жадный, а затем date:
  • ) Закрыть первую группу захвата
  • \d{4}\/\d{2}\/\d{2} Соответствует шаблону, подобному дате (обратите внимание, что этоСама дата не проверяется)
  • ( Группа захвата
    • [\s\S]+?^--- Совпадение 0+ раз с любым символом, не являющимся жадным, с последующим утверждением начала строки и совпадением 3 раза -
  • ) Закрыть группу захвата

const regex = /(^---[\s\S]+?date: )\d{4}\/\d{2}\/\d{2}([\s\S]+?^---)/gm;
const str = `---
title: test
date: 2018/10/17
description: some thing
---`;
const subst = `$1replacement$2`;
const result = str.replace(regex, subst);
console.log(result);
0 голосов
/ 17 октября 2018

Я не уверен, что Javascript вообще поддерживает взгляд назад, но если ваша среда его поддерживает, вы можете попробовать это регулярное выражение:

/(?<=---[\s\S]+)(?<=date: )[\d/]+(?=[\s\S]+---)/

Он ищет "---", за которым следует что-нибудь,затем он ищет «date:» перед тем, как сопоставить цифры или косую черту один или несколько раз, а затем просматривает все, что следует за «---».

Теперь вы можете легко заменить совпадение нановая дата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...