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]+?^---)
说明
(
捕获组
^---[\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);
---
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]+?^---)
说明
(
捕获组^---[\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);