Java的Regex --正则表达式
一、概述
正则表达式通常被用来对字符串提供范围性的校验、替换那些符合某个模式(规则)的文本。
正则表达式所对应的类Pattern,所有的正则表达式都是在这个类下创建的。Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式。
Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作。Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持。
完成使用方法如下:
String str = "abc";
//指定校验格式
Pattern p = Pattern.compile("abc");
//将当前的规则和判断字符串进行匹配
Matcher m = p.matcher(str);
//进行判断
boolean b = m.matches();
System.out.println(b);
二、正则表达式常用符号介绍
1、[ ] 表示匹配括号中的任意一个字符。比如:
[a - z ]:表示匹配任意一个小写字母。
2、^字符:如果用在[ ]内表示非;如果^放在了整个表达式的开头,表示强制以当前字符开头。比如:
[^a-z]:表示除了小写字母以外的字符;^[a-z]则表示以小写字母开头。
3、预定义符号:
- .:表示任意字符;
- \w:表示单词字符 [a-zA-Z_0-9]
- \d:表示数字[0-9];
- \s:表示空白字符:[ \t\n\x0B\f\r];
- \D:表示非数字: [^0-9]
- \W:表示非单词字符:[^\w]
- \S:表示非空白字符:[^\s]
示例如下:
public static void main(String[] args) {
String str = "\\\\";
//1. 字符串是由3个字符组成:第一个字符只能从a/b/c,第二个字符只能由r/s/t
// 第三个字符是数字
// [xyz] - 表示可以是x/y/z中的任何一个
// [a-b] - 按照码表从a开始一直找到b
//System.out.println(str.matches("[abc][rst][0-9]")); // 1.判断一个字符串是否是由一个小写字母组成
// System.out.println(str.matches("[a-z]")); // 2. [^abc]表示除了a/b/c
// System.out.println(str.matches("[^a-zA-Z]")); //3. 字符串由三个组成,第一个是字母,第二个是数字,
//“.”表示任意一个字符
//System.out.println(str.matches("[a-zA-Z][0-9].")); //4.判断字符串是否只有一个字符
//System.out.println(str.matches(".")); //匹配.
//\\. 经过java编译就变成了\.,正则再转义成. 表示.
//System.out.println(str.matches("\\.")); //\\\\java编译\\;\\正则编译后\
// \\\\ -> \\ -> \
//System.out.println(str.matches("\\\\"));
System.out.println(str.matches("\\w"));
System.out.println(str);
}
4、数量词:
- +:表示1次到多次 {1,};
- *:表示0次多到次 {0,};
- ?:表示0次到一次 {0,1};
- {n}:表示有且只有n次;
- {n,}:表示n次及其以上;
- {n,m}表示n-m次之间。
示例如下:
public static void main(String[] args) {
String str = "dasfd";
//1. {5}恰好由n次
System.out.println(str.matches("[a-zA-Z]{5}"));
//2. 至少由5个字母组成的字符串
//System.out.println(str.matches("[a-zA-Z]{4}[a-zA-Z]+"));
System.out.println(str.matches("[a-zA-Z]{5,}")); //3.由6-12个字符组成
System.out.println(str.matches(".{6,12}"));
}
二、捕获组
捕获组的特征:
1、用()括起来的单元称之为捕获组;
2、在正则表达式中,会对捕获组进行自动编号,编号从1开始。这与大多数的编号从0开始不同。
3、\n表示引用编号为n的捕获组;
4、捕获组的编号从(左括号的出现位置开始依次计数。
捕获组往往用于叠字的判断,示例如下:
//{2,} -- 至少两个字符
//(.)\\1+ 表示叠字
String str1 = "娃哈哈";
System.out.println(str1.matches(".*(.)\\1+.*"));
//AABB 高高兴兴 String str2 = "高高兴兴";
System.out.println(str2.matches(".*(.)\\1(.)\\2.*"));
//abab 休息休息 (..)任意两个字符
String str3 = "休息休息";
System.out.println(str3.matches("(..)\\1"));
三、正则表达式和String结合后的使用
使用Pattern和Matcher的方式匹配太过繁琐,我们往往使用字符串直接匹配的方法进行判断。
1、字符替换
将String字符串中的字符进行替换,返回一个新的字符,原字符串不变。例如:
String str = "asfsafasf12sad17--";
//将字符串替换为--
System.out.println(str.replaceAll("\\d", "-"));
//将字符串中的所有的数字去掉;参数:正则表达式
System.out.println(str.replaceAll("\\d", ""));
//所有非数字替换掉
System.out.println(str.replaceAll("\\D", "")); String sub = str.replaceAll("\\D", "");
2、对字符串进行切割
以某字符或数字作为切割符将字符串进行切割成多个子串,返回一个子串数组。例如:
//切割
String str = "40asfas40as1fasdcer4";
//以数字为切割符将字符串切割成多个子串
//作为切割符的字符会被整个切掉
//如果切割符在字符串的尾部,会被直接切掉
String[] arr = str.split("\\d");
System.out.println(arr.length);
for(String s : arr) {
System.out.println(s);
}
3、使用$引用上一个捕获组,对字符串进行去重和颠倒
将字符串中的多个连续的字符去掉,或者将单词进行颠倒。比如:
String str = "Cat Dog"; //将cat和dog的位置进行颠倒
//在替换过程中,\n的形式不起作用
//在替换过程中,如果想要引用上一个捕获组,那么需要使用$n的形式
System.out.println(str.replaceAll("(Cat)(.*)(Dog)", "$3$2$1"));
String str1 = "我我我我爱爱学学学学习习";
System.out.println(str1.replaceAll("(.)\\1+", "$1"));
Java的Regex --正则表达式的更多相关文章
- java.util.regex.Pattern正则表达式写验证器示例
import java.util.regex.Pattern; /** * 校验器:利用正则表达式校验邮箱.手机号等 * */ public class Validator { /** * 正则表达式 ...
- 由Java正则表达式的灾难性回溯引发的高CPU异常:java.util.regex.Pattern$Loop.match
问题与分析 某天领导report了一个问题:线上的CPU自从上一个版本迭代后就一直处于居高不下的状况,领导看着这段时间的曲线图判断是有两条线程在不停的死循环. 接到任务后去查看了AWS的CloudWa ...
- Java正则表达式java.util.regex类的简单使用
1.什么是正则表达式? 正则表达式(regular expression)是根据字符串集合内每个字符串共享的共同特性来描述字符串集合的一种途径.正则表达式可以用于搜索.编辑或者处理文本和数据. Jav ...
- 【总结】java regex 正则表达式 提取数字和去除数字,过滤数字,提取价格
@Test public void test33() { String phoneString = "哈哈,13888889999"; // 提取数字 Pattern patter ...
- Java程序设计之正则表达式
正则表达式平时在用到字符串处理的时候是比较常用的,个人觉得不需要刻意的去理解,用的话把文档拿出来查一下就好了,下面给个链接 http://www.php100.com/manual/Javascrip ...
- java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
使用repalceAll 方法出现java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0异常 ...
- 转:C++ Boost/tr1 Regex(正则表达式)快速指南
C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...
- 黑马程序员——【Java基础】——正则表达式
---------- android培训.java培训.期待与您交流! ---------- 一.概述 1. 概念:符合一定规则的表达式. 2. 作用:用于专门操作字符串. 3. 特点:用一些特定的符 ...
- 黑马程序员——JAVA基础之正则表达式,网络爬虫
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 正则表达式: 概念:用于操作字符串的符合一定规则的表达式 特点:用于一些特定的符号来表示一些代码 ...
随机推荐
- 在linux环境中如何删除文件
使用rm -rf 目录名字 命令即可 -r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思 eg 删除文件夹实例:rm -rf /var/log/httpd/acc ...
- 从0开始完成SpringBoot+Mybatis实现增删改查
1.准备知识: 1)需要掌握的知识: Java基础,JavaWeb开发基础,Spring基础(没有Spring的基础也可以,接触过Spring最好),ajax,Jquery,Mybatis. 2)项目 ...
- Ajax--XMLHttpRequest的使用
1.创建XMLHttpRequest对象(实现方法不统一): --IE把XMLHttpRequest实现为一个ActiveX对象: --其他浏览器(Firefox.Chrome等)把它实现为一个本地的 ...
- luogu P3357 最长k可重线段集问题
这题和3358一模一样,建模形式直接不用变,就两点不一样,一是len变化了,加入y后再更新即可,还有就是可能会出现x0=x1的情况,即一条开线段垂直x轴,如果我们依旧按照上一题的建图方法,就会出现负权 ...
- luogu P3358 最长k可重区间集问题
网络流建图好难,这题居然是网络流(雾,一般分析来说,有限制的情况最大流情况可以拆点通过capacity来限制,比如只使用一次,把一个点拆成入点出点,capacity为1即可,这题是限制最大k重复,可以 ...
- Python 网络编程之网络协议(未完待续)
一:网络编程从两大架构开始 1.网络开发的两大架构 c/s 架构 : client server B/S 架构 : Brower server (1)bs 和 cs 架构之间的关系? (2)哪一种 ...
- 超大数据量操作 java程序优化[转载]
一个表中有1000万以上的数据,要对其进行10万次以上的增删查改的操作,请问如何优化java程序对数据库的操作? 通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化. ...
- C# 自定义控件容器,设计时可添加控件
本分步指南介绍在将 UserControl 放在 Windows 窗体上之后,如何将 UserControl 对象用作设计时控件容器.可能会有这样的情况:您想将一个控件拖到 UserControl 中 ...
- Lesson 1 Finding fossil man
Why are legends handed down by storytellers useful? We can read of things that happend 5000 years ag ...
- 八 Hibernate延迟加载&抓取策略(优化)
面试:Hibernate效率很低,如何优化? 缓存怎么弄的,语句怎么优化? 聊聊一级缓存,聊聊抓取策略和延迟加载,聊聊批量抓取 延迟加载: 一般不单独使用,和延迟加载一起使用 延迟加载:lazy(懒加 ...