Pattern用法(正则表达式)
1. 正则表达式的应用
在给用户发送消息时通常情况会有相同的消息模板,但其中部分信息跟用户相关,因此需要对消息模板中的变量部分进行替换。而对于一个系统而言可能有很多套完全不同的模板。因此需要一个通用的根据实际信息替换消息模板中变量的方法。消息模板的变量与velcity中的变量规范相同。
publicstatic <K, V> String replacePlaceHolderWithMapValue(String msg,Map<K,V> placeHolderMap) {Patternpattern = Pattern.compile("\\$*!?\\{([\\w]+)\\}");Matchermatcher = pattern.matcher(msg);Map<String,String> replaceList = new HashMap();while(matcher.find()) {StringplaceHolder = matcher.group(0);Stringkey = matcher.group(1);Objectvalue = placeHolderMap.get(key);if(value != null) {replaceList.put(placeHolder,value.toString());}}for(Entry<String, String> keyValue:replaceList.entrySet()) {msg= msg.replace(keyValue.getKey(), keyValue.getValue());}returnmsg;}
方法中先获取所有的需要替换的变量存入replaceList中,然后再依次替换。上述方法的正则表达式中,([\\w]+)表示对匹配的内容中进行捕获,捕获值存入matcher.group中,当然也可以有多个捕获。
2. 常用正则表达式
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[\t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
\p{Lower} 小写字母字符:[a-z]
\p{Upper} 大写字母字符:[A-Z]
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
(X) X,作为捕获组
非捕获
(?=X) X,通过零宽度的正lookahead
(?!X) X,通过零宽度的负lookahead
(?<=X) X,通过零宽度的正lookbehind
(?<!X) X,通过零宽度的负lookbehind
(?>X) X,作为独立的非捕获组
3 贪婪匹配与懒惰匹配
考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab。
public static void main(String[] args) {String str = "北京市(海淀区)(朝阳区)";String paternStr = ".*(?=\\()";Pattern pattern = Pattern.compile(paternStr);Matcher matcher = pattern.matcher(str);if (matcher.find()) {System.out.println(matcher.group(0));}
}
上述方法的输出为:北京市(海淀区)
public static void main(String[] args) {String str = "北京市(海淀区)(朝阳区)";String paternStr = ".*?(?=\\()";Pattern pattern = Pattern.compile(paternStr);Matcher matcher = pattern.matcher(str);if (matcher.find()) {System.out.println(matcher.group(0));}
}
上述方法输出:北京市
Pattern用法(正则表达式)相关推荐
- java pattern用法_Java Pattern和Matcher用法
Pattern用法 Java正则表达式通过java.util.regex包下的Pattern和Matcher类实现 Pattern类用于创建一个正则表达式,也可以说是创建一个匹配模式,可以通过两个静态 ...
- oracle正则判断纯数字,oracle 判断字段是否为是数字 regexp_like用法 正则表达式
oracle 判断字段是否为是数字regexp_like用法正则表达式ORACLT TNND 2010-07-15 10:12:28 阅读303 评论0 字号:大中小订阅 /* ORACLE中的支持正 ...
- java pattern 用法_Pattern.compile用法
Pattern.compile函数的用法 在使用Pattern.compile函数时,可以加入控制正则表达式的匹配行为的参数: Pattern Pattern.compile(String regex ...
- java pattern详解_Java Pattern pattern()用法及代码示例
Java中Pattern类的pattern()方法用于获取正则表达式,将其编译以创建此模式.我们使用正则表达式创建模式,并且使用此方法来获取相同的源表达式. 用法: public String pat ...
- Pattern类正则表达式的编译表示形式
示例: package com.igeek01;import java.util.regex.Matcher; import java.util.regex.Pattern;/** java.util ...
- Java Pattern Matcher 正则表达式需要转义的字符
见:http://blog.csdn.net/bbirdsky/article/details/45368709 /*** 转义正则特殊字符 ($()*+.[]?\^{},|)* * @param k ...
- Python 之正则表达re.compile()与re.findall()详解
在使用爬虫提取网页中的部分信息时,采用到了re.compile()与re.findall()两种方法,目的:把网页中的"某某城市土地规划表"截取并打印出来. 网页中的代码: < ...
- 工作一年后端问题杂录
1,前端请求传Json对象则后端使用@RequestParam: 前端请求传Json对象的字符串则后端使用@RequestBody. 2,@RequestParam 多参数传值 const { dat ...
- 【Python】一文读懂Python正则表达式常用用法
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 编辑:爱学AI 来源:geekvi 链接: www.segmentfault.co ...
最新文章
- Dialog的使用(一):用AlertDialog提示
- 天兔安装手册-第一篇文章
- SDOI2017 新生舞会
- RxJava + Java8 + Java EE 7 + Arquillian =幸福
- hdu 4502 一维dp
- 数据库优化之简单理解
- OpenCV的车道线检测
- 微信小程序 转发 分享功能
- 张柏芝-从清纯走向堕落
- tibco往服务器发消息,Tibco EMS 初级使用方法小结
- C primer plus编程练习答案(上)
- vmware共享文件夹不显示
- layuiadmin配置mysql_layuiAdmin 后台管理模板
- java正则匹配英文_匹配英文句子的正则表达式
- 访问控制列表之基本ACL、高级ACL 、 高级ACL之ICMP、高级ACL之telnet
- 人工智能技术中的科学性与艺术性
- murmur3哈希算法 1
- WPF 一个性能比较好的 gif 解析库
- 元宇宙会成为 IPv6 的拐点吗?
- 135.如何进行离线计算-1
热门文章
- $(document).ready和window.onload 简单分析区别
- IList(T) 方法
- 客户端C和服务器S之间建立一个TCP连接,该连接总是以1KB的最大段长发送TCP段,客户端C有足够的数据要发送。当拥塞窗口为16KB的时候发生超时,如果接下来的4个RTT往返时间内的TCP段的传输是成
- 外贸三个月不出单就没工资,手里都是长线客户,是离职还是熬
- 金丹期前期:1.3、python语言-python的程序的控制结构:选择与循环
- 爬取全民K歌主页上的歌
- validate中submitHandler采用ajaxsubmit导致表单重复提交
- Arnold映射(猫映射)原理及 matlab源码
- Oracle SQL 交集 intersect 与差集minus
- Python 计算符号