JavaScript 正则断言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37263637/article/details/82631228

最近想把子串处理成markdown的表格形式。本来准备用正则表达式实现这个功能,发现还是有问题,不过借机学习了一下正则表达式中的断言部分,有了一点了解。

1 背景

Markdown 语法里面的表格是这样的:

| tableName | tableName | tableName |
| --------  | ----------| --------- |
| value     | value     | value     |

然后有个很长很长的国家语言表格式是下面这样的,我需要把下面格式的写成markdown表格格式。
LIBYAN ARAB JAMAHIRIYA LY
MACAO MO
MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF MK
向该造成markdown格式,即:
| LIBYAN ARAB JAMAHIRIYA | LY |
| MACAO | MO |
| MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF | MK |
要实现的目的就是 在每行字符串首尾加|,和字符串中最后一个空格替换成 |。

先来一波所想即所得code:

const fs = require('fs');
let strstream = fs.readFileSync('country');//表格数据存储在这个文件里
let strArray = (strstream.toString()).split(' \r\n');
console.info(strArray);
strArray.forEach(element => {
    let index = element.lastIndexOf(' ');
    fs.appendFile('country_out', `|${element.substring(0, index)}|${element.substring(index+1, element.length)}|\r\n`,()=>{});
});

OK 这就是我想要的,但整个code看起来一股浓浓的土鳖气息,有没有更高级优雅方案。
想了想正则表达式了。

2 JavaScript 正则表达式断言

当时依稀记着正则表达式有断言可能可以解决这个问题。

这里主要说明JavaScript中四种断言

  • 先行断言
  • 先行否定断言
  • 后行断言
  • 后行否定断言

其中后行断言要在较高浏览器版本和node版本才支持,单纯用文字表述它们的功能不太好描述,可直接看下面sample就能理解它们的使用了。

待处理的子串:’LIBYAN ARAB JAMAHIRIYA LY ‘

2.1 先行断言

let str ="LIBYAN ARAB JAMAHIRIYA LY";
console.info(/[A-Z]+(?=A)/g.exec(str));//先行断言   结果为LIBY  

// LIBY 结果本次匹配结尾必须是A,且不包括A,由A-Z组成的字符串([A-Z]),即只有字符串在A前面才匹配(?=A) .

let str ="LIBYAN ARAB JAMAHIRIYA LY";
console.info(/[A-Z]+(?=W)/g.exec(str));//先行断言   结果为NULL    

本次匹配结尾必须是W(?=W),且不包括W 由A-Z组成的字符串, 即没有字符串在W前面所以匹配不到

2.2 先行否定断言

let str ="LIBYAN ARAB JAMAHIRIYA LY";
console.info(/[A-Z]+(?!\s)/g.exec(str));//先行否定断言  结果为 LIBYA   

本次匹配结尾必须不是空格(?!\s),由A-Z组成的字符串[A-Z]。 即字符串不在\s前面才匹配。所以只能匹配到LIBYA ,N因为在s前面已经匹配不到了

2.3 后行断言

let str ="LIBYAN ARAB JAMAHIRIYA LY";
console.info(/(?<=\s)[A-Z]+/g.exec(str));//后行断言   结果为 ARAB  

本次匹配必须以空格开头(?<=\s),由A-Z组成的字符串,且不包含空格,所以匹配到第二ARAB,即只有字符串在空格后面才能匹配

2.4 后行否定断言

let str ="LIBYAN ARAB JAMAHIRIYA LY";
console.info(/(?<!\s)[A-Z]+/g.exec(str));//后行否定断言  结果为LIBYAN  

本次匹配必须不以空格开头(/(?

3 遗留的问题

还是没有解决到如何倒序进行正则表达式匹配。以后有空在研究。

4 参考链接

https://blog.csdn.net/newborn2012/article/details/18262677
https://blog.csdn.net/u012047933/article/details/38365541
http://es6.ruanyifeng.com/#docs/regex#%E5%90%8E%E8%A1%8C%E6%96%AD%E8%A8%80

猜你喜欢

转载自blog.csdn.net/m0_37263637/article/details/82631228
今日推荐