1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 正则匹配以某字符开头 以某字符结尾

正则匹配以某字符开头 以某字符结尾

时间:2022-03-20 06:15:48

相关推荐

正则匹配以某字符开头 以某字符结尾

前言

很久不更了0.0,现在公司里越来越没有了工作的激情,只剩下麻木的躯体和向往文艺的灵魂。

最近在整公司的QQ机器人开发,我们开发用到的是酷Q,用到的开发工具则是JCQ,然后因为对于图片或者文件消息等,接收到的字符串形如以下:

[CQ:image,file=50CB70BF5232E82C5E0D73184FAAE3EB.jpg]广东省方法[CQ:image,file=50CB70BF5232E82C5E0D73184FAAE3EB.jpg]dfsf[CQ:image,file=50CB70BF5232E82C5E0D73184FAAE3EB.jpg][CQ:image,file=50CB70BF5232E82C5E0D73184FAAE3EB.jpg]

这些东西对于目前公司的业务来说没有用处,所以想着用正则把他去掉,所以摸索了一段时间。

正文

一开始采用的正则:(以下为Java中的代码, \\ 是用来表示 \)

private static Pattern CQ_MSG_PATTERN = pile("\\[CQ:.*\\]")

在这中正则的影响下,通过replace替换后的字符串为"",很显然不是"广东省方法dfsf"(目标结果),这个结果看着像是直接将最开头的部分和最结尾的匹配上了。同事提醒我说这是贪婪和非贪婪的问题,让我找个非贪婪的匹配,于是改成了以下:

private static Pattern CQ_MSG_PATTERN = pile("\\[CQ:.*?\\]")

就完美的得到想要的结果了。

附录(随意看看)

一开始想着用Java的String的replace方法,毕竟它本身是支持正则的,但是想着用Pattern应该会省去Pattern对象的开销,于是看了一下replaceAll的源码:

public String replaceAll(String regex, String replacement) {return pile(regex).matcher(this).replaceAll(replacement);}

噢,原来正则的replace是这么用的,于是我的替换如下:

/*** @Description : 通过正则消除消息中的CQ标识** @param content 接收到的内容* @return : 当通过正则替换后的字符串为空时,返回false;否则返回true* @author : 申劭明* @date : /6/15 18:25*/private boolean isBadMessage(String content) {content = CQ_MSG_PATTERN.matcher(content).replaceAll("");return StringUtil.isNullOrEmpty(content);}

另外,如果你也在用CQ开发的话,记着加一些必要的缓存措施,JCQ中多线程调用CQ的获取用户信息的方法会出问题,所以能缓存就加缓存吧。再附上一个Java封装的极简单的Lru实现:

/*** @author SSM* @date /6/9 9:53*/public class LruCache<K, V> {private final int cacheSize;private final LinkedHashMap<K, V> map;public LruCache(int cacheSize) {this.cacheSize = cacheSize;this.map = new LinkedHashMap<K, V>(cacheSize, 0.75f, true){@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return cacheSize < this.size();}};}public V get(K key){return map.get(key);}public synchronized void put(K key, V value){map.put(key, value);}public synchronized void clear(){map.clear();}public synchronized int size(){return map.size();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。