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用法(正则表达式)相关推荐

  1. java pattern用法_Java Pattern和Matcher用法

    Pattern用法 Java正则表达式通过java.util.regex包下的Pattern和Matcher类实现 Pattern类用于创建一个正则表达式,也可以说是创建一个匹配模式,可以通过两个静态 ...

  2. oracle正则判断纯数字,oracle 判断字段是否为是数字 regexp_like用法 正则表达式

    oracle 判断字段是否为是数字regexp_like用法正则表达式ORACLT TNND 2010-07-15 10:12:28 阅读303 评论0 字号:大中小订阅 /* ORACLE中的支持正 ...

  3. java pattern 用法_Pattern.compile用法

    Pattern.compile函数的用法 在使用Pattern.compile函数时,可以加入控制正则表达式的匹配行为的参数: Pattern Pattern.compile(String regex ...

  4. java pattern详解_Java Pattern pattern()用法及代码示例

    Java中Pattern类的pattern()方法用于获取正则表达式,将其编译以创建此模式.我们使用正则表达式创建模式,并且使用此方法来获取相同的源表达式. 用法: public String pat ...

  5. Pattern类正则表达式的编译表示形式

    示例: package com.igeek01;import java.util.regex.Matcher; import java.util.regex.Pattern;/** java.util ...

  6. Java Pattern Matcher 正则表达式需要转义的字符

    见:http://blog.csdn.net/bbirdsky/article/details/45368709 /*** 转义正则特殊字符 ($()*+.[]?\^{},|)* * @param k ...

  7. Python 之正则表达re.compile()与re.findall()详解

    在使用爬虫提取网页中的部分信息时,采用到了re.compile()与re.findall()两种方法,目的:把网页中的"某某城市土地规划表"截取并打印出来. 网页中的代码: < ...

  8. 工作一年后端问题杂录

    1,前端请求传Json对象则后端使用@RequestParam: 前端请求传Json对象的字符串则后端使用@RequestBody. 2,@RequestParam 多参数传值 const { dat ...

  9. 【Python】一文读懂Python正则表达式常用用法

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 编辑:爱学AI 来源:geekvi   链接: www.segmentfault.co ...

最新文章

  1. Dialog的使用(一):用AlertDialog提示
  2. 天兔安装手册-第一篇文章
  3. SDOI2017 新生舞会
  4. RxJava + Java8 + Java EE 7 + Arquillian =幸福
  5. hdu 4502 一维dp
  6. 数据库优化之简单理解
  7. OpenCV的车道线检测
  8. 微信小程序 转发 分享功能
  9. 张柏芝-从清纯走向堕落
  10. tibco往服务器发消息,Tibco EMS 初级使用方法小结
  11. C primer plus编程练习答案(上)
  12. vmware共享文件夹不显示
  13. layuiadmin配置mysql_layuiAdmin 后台管理模板
  14. java正则匹配英文_匹配英文句子的正则表达式
  15. 访问控制列表之基本ACL、高级ACL 、 高级ACL之ICMP、高级ACL之telnet
  16. 人工智能技术中的科学性与艺术性
  17. murmur3哈希算法 1
  18. WPF 一个性能比较好的 gif 解析库
  19. 元宇宙会成为 IPv6 的拐点吗?
  20. 135.如何进行离线计算-1

热门文章

  1. $(document).ready和window.onload 简单分析区别
  2. IList(T) 方法
  3. 客户端C和服务器S之间建立一个TCP连接,该连接总是以1KB的最大段长发送TCP段,客户端C有足够的数据要发送。当拥塞窗口为16KB的时候发生超时,如果接下来的4个RTT往返时间内的TCP段的传输是成
  4. 外贸三个月不出单就没工资,手里都是长线客户,是离职还是熬
  5. 金丹期前期:1.3、python语言-python的程序的控制结构:选择与循环
  6. 爬取全民K歌主页上的歌
  7. validate中submitHandler采用ajaxsubmit导致表单重复提交
  8. Arnold映射(猫映射)原理及 matlab源码
  9. Oracle SQL 交集 intersect 与差集minus
  10. Python 计算符号