最近学正则表达式写的一个小工具——ToolsInTools

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

前阵都没事做,就抽空看了下正则表达式,毕竟上次打算学它的时候是4年前了~但是没坚持。正则确实是像传言的那样挺难的。但是如果静下心来慢慢看还是有迹可循的,就是比较烧脑而已,另外写长了容易眼花缭乱,等脑被烧完了就更难看懂了,恶性循环~

正则表达式网上大把的教程,就不班门弄斧了,然后因为最近项目刚做完,整理了一下用到的工具类,放到一个文件夹里,发现看起来特别乱,想着如果鼠标停在某个文件上可以看到一些备注信息就好点,不过系统貌似没有这个功能。那反正无聊,就干脆写一个工具。先上一个效果图吧。



其中需要的东西有同目录下的info.txt文件,res/regex.txt文件以及各种图标。

info.txt文件的作用是把需要显示的条目添加进去。为什么用这种方式而不是直接扫描所有文件,因为那样会把所有文件都显示出来,而有时候我会希望一些文件不要显示出来。

至于说如果有特别多文件那不是要一个个添加,是的!但是因为这只是放我个人常用的工具类,也就那么几个,慢慢地多的话随手添加一个条目并不麻烦。而且不可避免的需要为每个条目添加备注信息。

这个是info.txt文件的内容

#语法说明: 每行必须有四个箭头来包裹三个内容 >1>2>3>  
#内容1是文件名或特殊值  特殊值有【KEY】条目不会有点击事件并且显示自己的图标 【NULL】显示一个空行 【HR】显示一条水平线
#内容2是显示到条目的名称为空的话直接显示内容1
#内容3是message内容
#

#这里填写注释

>KEY>创建时间>2018年5月22日17:40:57>

#Android快速开发工具
>NULL>>>
>KEY>Android快速开发工具类>>
>NULL>>>
>HR>>>
>NULL>>>
>AppUtils.java>>和系统有关的工具类>

>DialogManager.java>>显示dialog的简单封装>

>EditTextUtils.java>>方便操作多个editText的工具类>

>L.java>>Log.e的封装。因为我只喜欢用Log.e()>

>PixelUtils.java>>和屏幕、尺寸相关的工具>

>SPUtils.java>>不用多说了。sp>

>StringUtils.java>>字符串相关的操作>

>NetUtils.java>>监察网络>

>KeyBoardUtils.java>>软键盘操作>

>ToastUtils.java>>Toast工具>

>MediaPlayerUtils.java>>MediaPlayer媒体播放音频>

>SoundUtils.java>>SoundPool音频池播放短音频>

#空行
>NULL>>>
>NULL>>>

>KEY>其他>>
>NULL>>>
>CodeFragment.txt>代码片段>一些代码片段>
>NULL>>>
#水平线
>HR>>>
>NULL>>>
>KEY>最后修改时间>2018年6月4日11:24:12>
>KEY>签名>瞅啥。就喜欢这样!!>

里面用的是我简单定义的语法:>fileName>showName>message>

这种简单的语法解析起来并不难,但这不在学正则吗,就用正则来解析吧。

解析这种语法的正则:

(?<=>).*?(?=>)

稍微解释一些:首先整体的意思是匹配所有以>开头>结尾的内容,就是我定义的语法>name>

分解出来解释:

'(?<=>)

这是正则的“零宽断言”,匹配字符'>'后面的内容。另外我试了一下,这个语句只有单词才能匹配多个比如(?<=test),如果是字符的话只能匹配一个。比如我只能写成'>'而不能是'>>'。

. 

这是正则的一个元字符,代表的意思是匹配除了换行符之外的所有字符。所有字符,所有字符!

*

这是一个限定字符,意思是匹配它前面的东西0-N次。比如前面是一个a,那么a*代表匹配a0次或1次以上。0次的意思就是可以不存在

?

问号也是限定字符,意思是匹配它前面的东西0次或1次,。而它也有一个特殊含义,就是懒加载。用了它之后它会尽可能少地匹配内容。匹配到一个之后就停止不再匹配。因为我只需要第一个>后面的内容,所以需要懒一点,不要那么勤快。

(?=>) 

最后面这个也是零宽断言,和第一个正好相反,它代表的是匹配字符'>'前面的内容。

合起来就是匹配所有>箭头>包裹>的内容>

另外代码里还用到了一个正则式,判断字符串是不是以'#'开头的。因为'#'我就当成是注释了。

^(?!( *#)).+$

解析内容时我分成一行一行解析,所以可以根据是不是#开头来判断需不需要解析。

^ 

元字符,匹配字符串的开始位置

(?!( *#))

 零宽断言,匹配后面连接的不是某字符的内容。如(?!test),这里( *#)的意思是()是一个整体,里面的内容为:零次或多次的空格之后紧跟着的#号。连起来就是匹配后面连接的不是 任意次数的空格之后的#号

.就不赘述了,+也是一个限定字符,意思是匹配的内容至少出现一次以上。连起来是:除换行符外的任意字符至少出现一次以上

$ 

最后这个是也是元字符,匹配字符串的结尾

这里就用到这些正则,如果对正则感兴趣可以去研究一下。这里推荐一篇

另外如果在学正则,又是做Android开发的,可以试下用AndroidStudio测试表达式[滑稽脸]。把测试字符串放一个文件里,按ctrl+f输入表达式,妥妥地测试[滑稽脸]

然后java代码都是比较简单的东西。主要是这么久不碰awt和swing了这次写的也还过得去。代码有点多就不贴了,有兴趣的可以看一下github

除了info.txt外还有regex.txt,里面的语法和info.txt一样,用于定义解析info.txt的正则。(最开始这么做是为了什么时候想换个语法就直接换个语法~)还可以对窗口进行一些配置。比如图标,标题,条目的图标等。有兴趣的可以研究一下。

可运行程序 点击下载

猜你喜欢

转载自blog.csdn.net/Moing557/article/details/80624086