---
title: test
date: 2018/10/17
description: some thing
---
如果在date
之间(在本例中为---
之间),我想替换2018/10/17
后面的内容。如何在JS中使用正则表达式来做到这一点?
到目前为止,我已经尝试过了;
/(?<=---\n)[\s\S]*date.+(?=\n)/
但是仅当日期是---
之后的第一行时才有效
答案 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]+?^---)
说明
(
捕获组
^---[\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:”,然后再与数字或斜杠匹配一次或多次,然后向前看所有跟“ ---”的东西
现在,您可以轻松地将匹配项替换为新日期。