记录一下在jaspersoft的时候遇到读取json后的类型转换的问题
- 介绍一下用到的js函数,会用到replaceAll和matchAll
- replaceAll和matchAll,跟replace和match不同地方是写正则时要用g标记,replace和match也可以用g,但是match不会返回捕获组,matchAll,才能得到捕获组
function replacer(match, p1, p2, /* …, */ pN, offset, string, groups) {
return replacement;
}[match,g1,g2...,index,input, groups]
- replaceAll和matchAll,跟replace和match不同地方是写正则时要用g标记,replace和match也可以用g,但是match不会返回捕获组,matchAll,才能得到捕获组
- replace用来替换数据类型的属性,match用来提取json key值
- 下面再介绍一下,其中一个比较值得注意的一个正则写法
- 需求:想匹配<image>标签,但是同时也有<imageExpress>标签,想帮所有的imge标签加上onErrorType=”Blank”属性,原本有这个的属性就不处理
- /(<image\b)(?![^>]*onErrorType=”Blank”)([\s\S]*?>)/gm
- \b可以避免匹配到imageExpress
- (?!)正向不匹配onErrorType这个属性
- 匹配所有字符然后>结尾
- g全局匹配,m多行匹配
- 注意(?!)是非捕获匹配所以这里只有两个捕获组p1,p2
- 在匹配跨行大量文本的使用如果使用[\s\S]来匹配的时候要主要结束标签不要被匹配
- /(<staticText>(?:(?!<\/staticText>)[\s\S])+?<printWhenExpression>)(.+)\!=(.+)\|\|(.+)\!=(.+)&&(.+)==(.+)<\/printWhenExpression>([\s\S]+?)(<text><\!\[CDATA\[O\]]><\/text>\s+<\/staticText>)/gm,
- 为确保不会跨staticText标签匹配,那么不能直接写[\s\S],用非捕获匹配的负向匹配,排除掉</staticText>子串,然后再通过非捕获匹配[\s\S]然后把他们全部接收
- 也不能直接使用(?!<\/staticText>)[\s\S]+?这种方式无法逐字符检查和排除
</staticText>
,因为[^\s\S]+?
匹配一次任意字符后就结束了先行断言检查。