正则表达式异常强大,一直理解不深,用的也不深,这次项目中尝试,体会到了它的强大之处。字符串查找,匹配,替换,正则无不能做,特别是灵活的运用子串匹配得到的变量值$1,$2,再进行二次处理能够达到很巧妙的效果。
Java中使用也比较简单:
1. 编译正则表达式的字面值得到对应的模式Pattern对象;
2. 创建匹配给定输入与此模式的匹配器Matcher;
3. 通过匹配器对象执行操作,匹配器对象的方法很丰富,方法之间组合使用更加强大。
public static void main(String[] args) { //被替换关键字的的数据源 Map<String,String> tokens = new HashMap<String,String>(); tokens.put("cat", "Garfield"); tokens.put("beverage", "coffee"); //匹配类似velocity规则的字符串 String template = "${cat} really needs some ${beverage}."; //生成匹配模式的正则表达式 String patternString = "\\$\\{(" + StringUtils.join(tokens.keySet(), "|") + ")\\}"; Pattern pattern = Pattern.compile(patternString); Matcher matcher = pattern.matcher(template); //两个方法:appendReplacement, appendTail StringBuffer sb = new StringBuffer(); while(matcher.find()) { matcher.appendReplacement(sb, tokens.get(matcher.group(1))); } matcher.appendTail(sb); //out: Garfield really needs some coffee. System.out.println(sb.toString()); //对于特殊含义字符"\","$",使用Matcher.quoteReplacement消除特殊意义 matcher.reset(); //out: cat really needs some beverage. System.out.println(matcher.replaceAll("$1")); //out: $1 really needs some $1. System.out.println(matcher.replaceAll(Matcher.quoteReplacement("$1"))); //到得邮箱的前缀名。插一句,其实验证邮箱的正则多种多样,根据自己的需求写对应的正则才是王道 String emailPattern = "^([a-z0-9_\\.\\-\\+]+)@([\\da-z\\.\\-]+)\\.([a-z\\.]{2,6})$"; pattern = Pattern.compile(emailPattern); matcher = pattern.matcher("test@qq.com"); //验证是否邮箱 System.out.println(matcher.find()); //得到@符号前的邮箱名 out: test System.out.println(matcher.replaceAll("$1")); //获得匹配值 String temp = "<meta-data android:name=\"appid\" android:value=\"joy\"></meta-data>"; pattern = Pattern.compile("android:(name|value)=\"(.+?)\""); matcher = pattern.matcher(temp); while(matcher.find()) { //out: appid, joy System.out.println(matcher.group(2)); } }
[...] 位于括号之内的任意字符
[^...] 不在括号之中的任意字符
. 除了换行符之外的任意字符,等价于[^\n]
\w 任何单字字符, 等价于[a-zA-Z0-9]
\W 任何非单字字符,等价于[^a-zA-Z0-9]
\s 任何空白符,等价于[\ t \ n \ r \ f \ v]
\S 任何非空白符,等价于[^\ t \ n \ r \ f \ v]
\d 任何数字,等价于[0-9]
\D 除了数字之外的任何字符,等价于[^0-9]
[\b] 一个退格直接量(特例)
{n, m} 匹配前一项至少n次,但是不能超过m次
{n, } 匹配前一项n次,或者多次
{n} 匹配前一项恰好n次
? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1}
+ 匹配前一项1次或多次,等价于{1,}
* 匹配前一项0次或多次.等价于{0,}
| 选择.匹配的要么是该符号左边的子表达式,要么它右边的子表达式
(...) 分组.将几个项目分为一个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配的字符以供此后引用使用
\n 和第n个分组所匹配的字符相匹配.分组是括号中的子表达式(可能是嵌套的).分组号是从左到右计数的左括号数
^ 匹配的是字符的开头,在多行检索中,匹配的是一行的开头
$ 匹配的是字符的结尾,在多行检索中,匹配的是一行的结尾
\b 匹配的是一个词语的边界.简而言之就是位于字符\w 和 \w之间的位置(注意:[\b]匹配的是退格符)
\B 匹配的是非词语的边界的字符
相关推荐
对于多子串匹配,需要检查`re.re_nsub`来确定有多少个子表达式。 在完成匹配后,别忘了释放正则表达式资源: ```c regfree(&re); ``` 除了C语言的标准库`<regex.h>`,还有其他第三方库提供更强大的正则表达式支持...
`split`方法是Java `String`类中的一个成员方法,其主要功能是从当前字符串中根据指定的正则表达式进行分割,并返回一个字符串数组。这意味着我们可以使用它来按照特定的分隔符或者模式将字符串拆分成多个子串。 ##...
java编的n*n多子棋,该规则定义的是三子棋,改编条件可变成n子琪
正则表达式是一种用于匹配字符串模式的语言。 **7.3 样式比对** 通过正则表达式可以匹配文本中的特定模式。 **7.4 Perl怎么比对** Perl使用`m//`或`//`模式匹配运算符来执行正则表达式匹配。 **7.5 怎么开始...
基于调制宽带转换系统(MWC),提出一种基于多子带信号采样和小波变换的宽带频谱感知方法。首先利用MWC实现宽带信号的低速率采样,得到子带信号;然后提出一种噪声功率及检测门限估计方法,再利用能量检测法实现对非...
### NC65多子表开发及其合计功能实现 #### 多子表开发概述 NC65作为一款先进的企业管理软件,在其开发过程中支持多种定制化需求,其中包括多子表的开发。多子表的设计使得用户可以在同一张单据上管理多个不同类型的...
S7-400多子站系统中用IM151-8 PN_DP CPU替换IM151-7 CPU的研究与实现.pdf
为了实现多子面板的拼接,可能使用了Java Swing或JavaFX这样的图形用户界面库。每个子面板代表一个独立的绘图区域,可以单独设置属性,比如改变颜色或增加圈数。在控制台中输入1、2、3、4分别运行这四个子面板,可以...
本篇文献主要介绍了基于多子阵的数字波束形成(DBF)技术,以及这种技术在FPGA平台上的实现。数字波束形成技术是雷达和电子侦察系统中的一个重要组成部分,其基本原理是对多通道回波数据进行空间积累和处理,从而实现...
在Java开发过程中,特别是在大型项目中,我们常常会遇到多模块结构的情况,每个模块负责不同的功能,这样的组织方式便于代码的管理和复用。IntelliJ IDEA(Idea)作为流行的Java开发工具,提供了对多模块项目的支持...
为了有效解决高分辨海底地形探测中海底回波方位估计问题,提出了多子阵波束域MUSIC算法,该方法将多子阵波束域算法的稳健性与MUSIC算法的高分辨特性相结合,以期能够降低运算量并减低信噪比门限,为高分辨海底地形...
由于它与其它方法相比具有计算量小,易于硬件实现等优点,围绕减少搜索空间和减少匹配时间的问题,人们相继提出了序贯相似性检测算法、两级模板匹配算法、分层序贯匹配算法、多子区域相关匹配算法等各种快速匹配算法...
3. **编码与解码**:将模型参数转化为遗传算法能处理的基因串,以及将基因串解码回模型参数。 4. **遗传操作**:执行选择、交叉和变异操作,更新种群。 5. **迭代与终止条件**:算法不断迭代,直到达到预设的迭代...
此外,IKAnalyzer还引入了基于正则表达式的动态扩展词典,可以识别一些未登录词,增强了对新词和网络热词的处理能力。 在分词策略上,IKAnalyzer支持精确模式、全模式、最短路径模式以及智能切分模式。精确模式尽...
多子直方图均衡微光图像增强及FPGA实现.pdf
本资料提供的是基于多子群的共生非均匀高斯变异樽海鞘群算法(Multi-Swarm Non-uniform Gaussian Mutation Siphonid Algorithm, MSNSSA)在解决单目标优化问题的应用实例,并附带了MATLAB实现代码。 在优化问题中,...
python多子图-3柱状图-三目标绘制 SCI绘图
在粒子群优化算法基础上,提出了基于聚类的多子群粒子群优化算法。该算法在每次迭代过程中首先通过聚类方法把粒子群体分成若干个子群体,然后粒子群中的粒子根据其个体极值和“子群”中的最优粒子更新自己的速度和...
2. 字符串操作:在Java中,字符串是不可变的。题目中的`String s = "ABCD"; s.concat("E");`会创建一个新的字符串"ABCDE",但不会改变`s`本身。`s.replace('C','F')`同样不会改变`s`,而是返回一个新的字符串"ABFD...