java正则表达式基础知识(转)
1基础
2.1 简单字符类
| 构造 | 描述 |
|---|---|
| [abc] | a,b或c |
| [^abc] | 除a,b或c外的字符 |
| [a-zA-Z] | a至z 或 A至Z |
| [a-d[m-p]] | a至d 或 m至p |
| [a-z&&[def]] | d,e或f |
@Test
public void testChar() {
//匹配 b,c或d
assertTrue("d".matches("[bcd]"));
//匹配除 a,b,c 以外的字符 (否定)
assertTrue("d".matches("[^abc]"));
//匹配 a至z 的任一字符 (范围)
assertTrue("d".matches("[a-z]"));
//匹配 d,e或f (交集)
assertTrue("d".matches("[a-z&&[def]]"));
}
2.2 预定义字符类
| 构造 | 描述 |
|---|---|
| . | 任意字符 |
| \d | 一个数字 [0-9] |
| \D | 一个非数字 [^0-9] |
| \s | 空白字符 [ \t\n\x0B\f\r] |
| \S | 非空字符 |
| \w | 常规字符 [a-zA-Z_0-9] |
| \W | 非常规字符 |
@Test
public void testPredef() {
//匹配 任意字符 (可能不匹配行终止符)
assertTrue("d".matches("."));
//匹配 数字
assertTrue("4".matches("\\d"));
//匹配 非数字
assertTrue("d".matches("\\D"));
//匹配 空白字符 [ \t\n\x0B\f\r]
assertTrue(" ".matches("\\s"));
//匹配 非空字符
assertTrue("d".matches("\\S"));
//匹配 常规字符 [a-zA-Z_0-9]
assertTrue("d".matches("\\w"));
//匹配 非常规字符
assertTrue("!".matches("\\W"));
}
2.3 量词
| 贪心 | 勉强 | 描述 |
|---|---|---|
| X? | X?? | X出现一次或没有 |
| X* | X*? | X出现零次或多次 |
| X+ | X+? | X出现一次或多次 |
| X{n} | X{n}? | X出现n次 |
| X{n,} | X{n,}? | X出现至少n次 |
| X{n,m} | X{n,m}? | X出现至少n次,至多m次 |
@Test
public void testQuant() {
// * 表示出现0次或多次 (贪心,最大匹配)
assertEquals("<b>d<b>".replaceAll("<.*>","#"),"#");
// * 表示出现0次或多次,? 表示最小匹配
assertEquals("<b>d<b>".replaceAll("<.*?>","#"),"#d#");
// + 表示出现1次或多次 (贪心,最大匹配)
assertEquals("<b>d<b>".replaceAll("<.+>","#"),"#");
// * 表示出现1次或多次,? 表示最小匹配
assertEquals("<b>d<b>".replaceAll("<.+?>","#"),"#d#");
// {1} 表示出现1次
assertEquals("<b>d<b>".replaceAll("<.{1}>","#"),"#d#");
// {1,} 表示出现1次至多次
assertEquals("<b>d<b>".replaceAll("<.{1,}>","#"),"#");
// {1,8} 表示出现1次至8次
assertEquals("<b>d<b>".replaceAll("<.{1,8}>","#"),"#");
}
2.4 分组
@Test
public void testGroup() {
// () 表示分组,?表示出现0次或1次,\\d\\d表示两个数字
assertFalse("du2".matches("du(\\d\\d)?"));
// 匹配
assertTrue("du12".matches("du(\\d\\d)?"));
// 不匹配,分组条件出现了2次
assertFalse("du1212".matches("du(\\d\\d)?"));
// 匹配
assertTrue("du1212".matches("du(\\d\\d)+"));
}
2.5 边界匹配
| 边界构造 | 描述 |
|---|---|
| ^ | 行开始 |
| $ | 行结尾 |
| \b | 单词边界 |
| \B | 非单词边界 |
| \A | 输入开始 |
| \z | 输入结尾 |
@Test
public void testBound() {
// ^ 行开始
assertTrue("42du".matches("^(\\d\\d)du"));
// $ 行结尾
assertTrue("42du".matches("\\d\\d(du)$"));
// \\b 表示单词边界
assertTrue("a dog".matches(".*\\bdog\\b"));
// \\B 表示非单词边界
assertTrue("a doggie".matches(".*\\bdog\\B.*"));
}
2.6 Pattern和Matcher基本
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherDemo {
public static void main(String[] args){
// 不区分大小写
Pattern pattern = Pattern.compile("\\bdog\\B",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("The Doggie plays");
while (matcher.find()) {
System.out.println(matcher.group());
System.out.println(matcher.start());
System.out.println(matcher.end());
}
}
}
输出
Dog
4
7
3 示例
3.1 用户名正则
/*
* ^ 开头
* [a-z0-9_-] 匹配a-z,0-9,下划线,中线
* {4,10} 长度4至10
* $ 结尾
*/
String unReg = "^[a-z0-9_-]{4,10}$";
3.2 颜色正则
/*
* ^ 开头
* # "#" 符号
* ( 开始分组
* [A-Fa-f0-9]{6} 长度为6的字母数字
* | 或
* [A-Fa-f0-9]{3} 长度为3的字母数字
* ) 分组结束
* $ 结尾
*/
String coReg = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";
3.3 24时制时间
/*
* ( 分组开始
* [01]?[0-9] 0-9,00-09,10-19
* | 或
* 2[0-3] 20-23
* ) 分组结束
* : :符号
* [0-5][0-9] 00 至 59
*/
String tiReg = "([01]?[0-9]|2[0-3]):[0-5][0-9]";
4 结语
本文简要介绍了java正则表达式的最基础的知识内容,并给出了简单实用的小例子来理解消化所学内容。要想熟练掌握这些基础知识,还要动手多加以练习,阅读官方文档。java正则表达式的进阶的内容我会在下一篇文章里进行介绍。
推荐java正则表达式学习的一些资料:
英文:vogella.com
中文:runoob.com
java正则表达式基础知识(转)的更多相关文章
- Java正则表达式基础知识整理
指定为字符串的正则表达式必须首先被编译为此类的实例.然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配.执行匹配所涉及的所有状态都驻留在匹配器中,所以多个 ...
- Java正则表达式基础知识及实例说明
众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学习及使用正则表达式,便成了解决这一矛 ...
- javascript之正则表达式基础知识小结
javascript之正则表达式基础知识小结,对于学习正则表达式的朋友是个不错的基础入门资料. 元字符 ^ $ . * + ? = ! : | \ / ( ) [ ] { } 在使用这些符号时需要 ...
- Java 多线程——基础知识
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- java必备基础知识(一)
学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ...
- 什么才是java的基础知识?
近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...
- java部分基础知识整理----百度脑图版
近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...
- JAVA相关基础知识
JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...
- Scala学习笔记--正则表达式基础知识、如何在scala内使用
正则表达式语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx 基础知识:正则表达式30分钟入门教程 http://www. ...
随机推荐
- 15、Django实战第15天:我要学习咨询
今天完成的是课程机构列表页面的最后一个模块:我要学习 我们在models中创建对应的表时UserAsk.之前我们讲过:在做表单的时候,我们可以通过forms先对提交的数据做验证,之前我们使用的是For ...
- telnet执行过程及验证远程服务器是否打开
telnet执行过程: 工作原理: 当你用Telnet登录进入远程计算机系统时,你事实上启动了两个程序,一个 叫Telnet客户程序,它运行在你的本地机上:另一个叫Telnet服务器程序,它运 行在你 ...
- 【计算几何】【状压dp】Codeforces Round #226 (Div. 2) D. Bear and Floodlight
读懂题意发现是傻逼状压. 只要会向量旋转,以及直线求交点坐标就行了.(验证了我这俩板子都没毛病) 细节蛮多. #include<cstdio> #include<algorithm& ...
- 【带修莫队】【权值分块】bzoj3196 Tyvj 1730 二逼平衡树
这题用了三种算法写: 分块+二分:O(n*sqrt(n*log(n)) 函数式权值分块:O(n*sqrt(n)) 带修莫队+权值分块:O(n5/3) 结果……复杂度越高的实际上跑得越快……最后这个竟然 ...
- 【floyd】CODEVS 1077 多源最短路
floyd模板 #include<cstdio> #include<algorithm> using namespace std; ][],m,x,y,n; int main( ...
- Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
/** * 函数式编程进阶: * 1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量 * 2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 ...
- 在sublime执行自定义脚本
[背景] 一般项目都会有一个预处理的脚本, 在发布,或者预览效果的时候,往往要先执行脚本. 想法来自editplus 习惯了editplus的同学,都知道,可以配置自定义执行的脚本. 一般我会把它配置 ...
- <command-line>:0: error: macro names must be identifiers
编译时的出错信息:<command-line>:0: error: macro names must be identifiers 原因: You have a -D flag with ...
- SqlServer_删除重复行只保留一条记录
前提:相同的数据重复往数据库写入,导致存在仅主键Id不同的重复数据,现在需要去除重复数据,仅保留重复数据中Id最大的一条 思路: 1.找出存在重复数据的记录,并取重复数据中最大的Id值 2.删 ...
- js循环遍历的两种方法for循环和for ... in 循环
JS数组的遍历方法有两种: 第一种:一般的for循环,例如: var a = new Array("first", "second", "third& ...