最近想把子串处理成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