要使用正则表达式更改文本,如果我们不能使用replace()但必须使用matchAll(),它是怎么做的?

问题描述 投票:-2回答:2

以下是一个棘手的正则表达式问题。让我们看看是否可以尝试通过正则表达式方法达成解决此类问题的一般规则:

假设我们的字符串格式错误:

2020-01-02 go supermarket 2020-01-03 wash dish\ndo laundry 2020-01-04
wash car 2020-01-05 clean up

要求将日期分开显示在其单独的行中,前后带有一些换行符。您可以选择在日期之后添加一条水平线,使其看起来更好。

第一次约会出现前可能会有一些文本,因此文本也应包含在结果中。 (只是说可以将任何文本和日期混合在一起,并且结果应包含所有原始文本)。

也许是因为最近我在处理数组问题,所以第一次尝试是使用match()matchAll()来做。但这有点棘手,结果缺少最后一部分(请参见下文:"clean up"文本未显示)。我想到要使用split()join() ...,结果证明replace()应该是相同且更干净的,看起来很适合完成这项工作:

const s = '2020-01-02 go supermarket 2020-01-03 wash dish\ndo laundry 2020-01-04 wash car 2020-01-05 clean up';

let result = s.replace(/((\d{4}-\d{2}-\d{2})(\s*))/g, '\n\n$2  ----------------------\n\n');

result = result.replace(/^\n*/, '');  // <-- hacky
console.log(result);

但是即使一开始就需要删除多余的\n也是有点棘手-如果我们使用这种replace()方法,还有更好的方法吗?

并且主要的问题确实是:如果要求是我们不能使用replace()split()join(),而只能使用match()matchAll(),那怎么办?

以下内容的问题是(1)在结果的开头增加了换行符,并且(2)日期后的最后一项丢失了(文本"clean up"未显示)。因为我们不能使用贪婪匹配,所以看起来很乱,然后原始文本的最后部分将不匹配,因为最后没有日期了:

const s = '2020-01-02 go supermarket 2020-01-03 wash dish\ndo laundry 2020-01-04 wash car 2020-01-05 clean up';

let result = '';
let matches = s.matchAll(/([^]*?)(\d{4}-\d{2}-\d{2}(\s*))([^]*?)/g);

for (let m of matches) {
  result += m[1] + '\n\n' + m[2] + '  --------------------\n\n' + m[4];
}

console.log(result);

基本上可以使用(1)match()matchAll()或(2)replace()split()join()解决这类问题吗?也就是说,如果match()matchAll()似乎运行不佳,我们真的应该立即考虑使用replace()的第二种方法吗? (我认为split()join()replace()相同。我希望得到一个普遍的规则,即如果matchAll()似乎不能很好地解决问题,那么我们应该真正考虑第二个问题解决此类问题的方法类型,即使用replace()

我希望有这样一条一般规则的原因是:(1)以我自己的知识为手段来解决这些问题,(2)如果我被[C0 ]方法持续10分钟,仍然尝试使用matchAll()解决它,我可能会因为判断自己不是一个好的程序员而变得很肤浅,因此被拒绝了。

以下是一个棘手的正则表达式问题。让我们看看是否可以尝试通过正则表达式方法来解决此类问题的一般规则:假设是否有格式错误的字符串:2020 -...

javascript regex
2个回答
0
投票

是,matchAll()是从matchAll()交换过来的好选择。我决定稍微清理一下您的正则表达式,以便于理解。完整的工作演示,位于matchAll()


0
投票

要处理第一个日期之前的可能文本,可以使用正则表达式来查找日期(\d{4})之前的某些文本,然后查找直到下一个日期或字符串结尾(2020-01-02 -------------------- go supermarket1456 2020-01-03 -------------------- wash dish do laundry 2020-01-04 -------------------- wash car 2020-01-05 -------------------- clean up )的其他字符。在处理匹配项时,如果定义了第一个捕获组,则将其输出,否则将仅输出日期及其相应的动作:

© www.soinside.com 2019 - 2024. All rights reserved.