js正则表达式替换特定段落中的匹配项

js regex replace match in certain paragraph

---
title: test
date: 2018/10/17
description: some thing
---

我想替换 date 后面的内容,如果它在 --- 之间,在本例中是 2018/10/17。如何在 JS 中使用正则表达式来做到这一点?

到目前为止我已经尝试过了;

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

但仅当日期是 ---

之后的第一行时才有效

我不确定 Javascript 是否支持向后看,但如果您的环境支持它,您可以试试这个正则表达式:

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

它向后查找“---”,然后是任何内容,然后在匹配数字或斜线一次或多次之前向后查找 'date: ',然后向前查找任何内容,然后是“-” --'.

现在您可以轻松地用新日期替换匹配。

这是可能的,但我不建议:

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

这需要替换为 substitution,请参阅 a demo on 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 引擎不支持详细模式)。

如果不使用积极的回顾,您可以使用 2 个捕获组并在替换中使用它们,例如 $1replacement$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 = `replacement`;
const result = str.replace(regex, subst);
console.log(result);