正则匹配文本
正则匹配文本

正则匹配文本

记录一下在jaspersoft的时候遇到读取json后的类型转换的问题

  1. 介绍一下用到的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]
  2. replace用来替换数据类型的属性,match用来提取json key值
  3. 下面再介绍一下,其中一个比较值得注意的一个正则写法
    • 需求:想匹配<image>标签,但是同时也有<imageExpress>标签,想帮所有的imge标签加上onErrorType=”Blank”属性,原本有这个的属性就不处理
    • /(<image\b)(?![^>]*onErrorType=”Blank”)([\s\S]*?>)/gm
      • \b可以避免匹配到imageExpress
      • (?!)正向不匹配onErrorType这个属性
      • 匹配所有字符然后>结尾
      • g全局匹配,m多行匹配
      • 注意(?!)是非捕获匹配所以这里只有两个捕获组p1,p2
  4. 在匹配跨行大量文本的使用如果使用[\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]+? 匹配一次任意字符后就结束了先行断言检查。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注