js正则表达式替换某些段落中的匹配项

时间:2018-10-17 14:30:28

标签: regex lookbehind

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

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

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

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

但是仅当日期是---之后的第一行时才有效

3 个答案:

答案 0 :(得分:2)

虽然不建议使用imo,但有可能:

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

这需要替换为$1$2substitution$4$5,请参见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引擎不支持详细模式)。

答案 1 :(得分:2)

不使用正向后掩饰,您可以使用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 = `$1replacement$2`;
const result = str.replace(regex, subst);
console.log(result);

答案 2 :(得分:1)

我不确定Javascript是否支持落后,但是如果您的环境支持,则可以尝试使用此正则表达式:

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

它在后面跟有“ ---”,后跟任何东西,然后在后面跟有“ date:”,然后再与数字或斜杠匹配一次或多次,然后向前看所有跟“ ---”的东西

现在,您可以轻松地将匹配项替换为新日期。