正则表达式高阶(三)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言

很久没写文章了今年由于种种原因年初休息了两个月后面又由于今年的环境被休息了两个月端午节过后终于开始上班了只是这个班比想象中要忙很多。趁着晚上这会儿不想撸代码便把最近撸代码时的一些正则的心得记录下来。

案例

xml 标签转 bean 属性使用正则

闲话少说正则的强大之处前面已经介绍过了这里就不在赘述。只是最近工作中的一些场景突发奇想发现使用正则可以大大减轻重复工作量。
场景如下最近对接的系统需要用到 xml 解析由于原来系统内部都是 json 交互的为了适配需要把接收到的 xml 报文转换为 bean 业务完成以后需要把对应的数据转换为 xml 返回。
例如需要把下面的 xml 报文转换为 bean 对象

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Head>
        <SvcId>007</SvcId>
        <SvcCode>01</SvcCode>
        <IpAddress>127.0.0.1</IpAddress>
        <MacAddress>FD-RF-EF-IU</MacAddress>
    </Head>
    <Body>
        <Name>张三</Name>
        <Age>18</Age>
        <Class>三年级一班</Class>
        ......
    </Body>
</Root>

当然这里只是一个实例实际的业务数据肯定比这个多很多我们需要把业务数据也就是<Body></Body> 标签中的数据解析为 bean 对象。通常为了方便我们一般会使 bean 对象的属性与标签保持一致。所以这就是一个体力活

public class ServiceEntity{

	private String name;
	
	private String age;
	
	......
}

一个一个标签拷贝过来改个首字母大小写贴进去就可以了我第一个也是这样通过 CTRL+CCTRL+V 完成的这也没什么不好毕竟大家都是这样做的。只是看到第二个 body 标签里有将近上百的属性时…
于是我就想这玩意还有没有简单一点的办法于是就想到了使用正则一实验发现比想象的要简单和好用。
例如要将下面的标签转换为 bean 属性

<Name>张三</Name>
<Age>18</Age>
<Class>三年级一班</Class>
......

只需要一个简单的查找替换即可完成

# 查找正则
^<(\w)(\w*)>.*

# 替换正则
private String \L$1\E$2;\r\n

于是替换完成之后就变成了这样

private String name;

private String age;

private String class;

于是这需要一个CTRL C V 即可完成当然字段类型可能部分需要调整。常用的编辑器例如 notepad++editPlusidea 等工具都支持正则替换。
前面 xmlbean 已经通过这种偷懒的方式完成了我们还需要把结果转换为 xml这里我们用到了 freemarker所以就需要定义模版。

bean 属性转 xml 标签使用正则

有了前面的经验我们需要把对应的 bean 转换为 ftl 模板也就不那么难了直接上例子还是以前面的例子为基础这次我们需要把对应的属性转换为对应的 xml 标签正则来了

# 查找正则
^\w+\s+\w+\s+(\w)(\w*);

# 替换正则
<\U$1\E$2>${$1$2}<\U$1\E$2>

于是上面的属性就变成了这个样子

<Name>${name}<Name>

<Age>${age}<Age>

<Class>${class}<Class>

当然也可以把他们之前的空行去掉

^\w+\s+\w+\s+(\w)(\w*);\r\n

very good如果有大量这种重复工作通过这种方式还是可以减少不少工作量的。
当然正则有些时候也不是万能的比如最近遇到的一个需求需要把xml 报文头的内容提取到 bean 中结果我们写了一个常常的正则出来一共需要提取 20 多个字段需求是满足了但是我测试了下发现效率非常低一次解析需要100+毫秒这个速度是不能接受的。最后经过测试我发现如果一次只提取四五个字段使用这种方式还是很快的解析一次用时不到一毫秒基于以上发现我把上面长长的正则分解为五段对5分分别解析最后测试发现使用这种方式完全可以把解析时间控制在3毫秒以后这个速度是可以接受的。

结语

所以正则很强大但是正则不是万能。在适合的场景还是很好用的。今天的分享就到这里感谢您的阅读如果不足之处欢迎指正。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6