Java 正则初探
正则表达 初探*
走进沼泽
问题引出
- 问题:判断一个String字符串是否为数字字符串
- 将字符串转换为字符数组
- 判断每一个字符是否在“0~9”范围之间
public class TestDemo {
public static void main(String [] args) {
String str = "123" ;
System.out.println(isNumber(str));
}
public static boolean isNumber(String temp) {
char data [] = temp.toCharArray();
for (int x = 0 ; x < data.length ; x ++ ) {
if (data[x] > '9' || data[x] < '0') {
return false ;
}
}
return true;
}
}
- 上述问题改用正则表达判断
public class TestDemo {
public static void main(String [] args) {
String str = "123" ;
System.out.println(str.matches("\\d+"));
}
}
java.util.regex 包
Pattern 类
- 需要使用 compile() 方法来取得类对象
Matcher 类
- 需要 Pattern 类取得
正则标记(熟记)
java.util.regex.Pattern 中定义正则标记
| 字符 | 匹配 |
|---|---|
| x | 字符 x |
| \ \ | 反斜杠 |
| \ t | 制表符 |
| \ n | 换行 |
- ps:在正则中出现对符号的正则,均需要反斜杠进行转移(\ \)
| 字符集 | 匹配 |
|---|---|
| [abc] | 表示字符a,b,c中任意一位 |
| [^abc] | 表示不是字符 a,b,c 中任意的一位 |
| [a-z] | 所有的小写字母 |
| [A-Z] | 所有的大写字母 |
| 字符集表达式 | 匹配 |
|---|---|
| . | 任意一位的字符 |
| \d | 匹配一位数字“[0-9]"(在代码中两杠等于一个杠) |
| \D | 不匹配数字 [ ^0-9 ] |
| \s | 任意的空白字符 (\t \n ……) |
| \S | 任意的非空白字符 |
| \w | 表示任意字母、数字、下划线 [ a-zA-Z_0-9] |
| \W | 表示非字母、数字、下划线 [ ^a-zA-Z_0-9] |
- 边界匹配,建议在JavaScript中使用,不在java中使用
| 符号 | 匹配 |
|---|---|
| ^ | 正则的开始 |
| $ | 正则的结束 |
数量表达
- 正则 ?:表示此正则可以出现0或1次
- 正则 + :表示此正则可以出现1或多次
- 正则 * :表示此正则可以出现0、1或多次
- 正则 {n}:表示此正则出现N次
- 正则{n,}:表示此正则出现N+次
- 正则{n,m}: 表示此正则出现n~m次
逻辑运算
- 正则1 正则2:正则1判断以后继续完成判断正则2
- 正则1|正则2:正则1或正则2 有一组满足即可
- (正则集):将多个正则作为一组,可以设置这一组单独设置出现的次数
String 类对正则的支持
方法
- public boolean matches(String regex)
- 正则验证
- public String replaceAll(String regex , String replacement)
- 全部替换
- public String replaceFirst (String regex , String replacement)
- 替换首个
- public String [] split(String regex)
- 全部拆分
- public String [] split(String regex , int limit)
- 部分拆分
实例
- 字符串替换
public class TestDemo {
public static void main(String [] args) {
String str = "Mirror is niubi" ;
String regex = "[^a-z]" ; // 正则
System.out.println(str.replaceAll(regex,""));
}
}
将不是小写的字母用空字符代替
- 分隔字符
public class TestDemo {
public static void main(String [] args) {
String str = "Mirror12342is1231niu123123bi" ;
String regex = "\\d+" ; // 正则 1个以上的数字
String result [] = str.split(regex); // 数组
for (int x = 0; x < result.length; x++) {
System.out.println(result[x]);
}
}
}
按照数字为条件分隔字符,并被分隔的字符串存入数组中
- 验证字符串是否是数字,如果是变为double型
public class TestDemo {
public static void main(String [] args) {
String str = "10.1" ;
String regex = "\\d+(\\.\\d+)?" ; // 正则 小数
System.out.println(str.matches(regex));
if (str.matches(regex)) {
System.out.println(Double.parseDouble(str));
// 将str转换为double输出
}
}
}
- 判断str是否是IPv4地址
public class TestDemo {
public static void main(String [] args) {
String str = "192.168.1.1" ;
String regex = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}" ;
String regexs = (\\d{1,3}\\.){3}\\d{1,3}; //正则简化
System.out.println(str.matches(regex));
if (str.matches(regex)) {
System.out.println(str);
}
}
}
- 判断是否为日期格式,如果是转为Date型数据
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestDemo {
public static void main(String [] args) throws ParseException {
String str = "2009-01-01" ;
String regex = "\\d{4}-\\d{2}-\\d{2}" ;
System.out.println(str.matches(regex));
if (str.matches(regex)) {
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(str);
System.out.println(date);
}
}
}
判断电话号码:(如下是合法的电话号码格式)
12345678
010-12345678
(010)-12345678
public class TestDemo {
public static void main(String [] args) throws ParseException {
String str = "(010)-12345678" ;
// String regex = "(\\d{7,8})|(\\d{3,4}-\\d{7,8})|(\\(\\d{3,4}\\)-\\d{7,8})" ;
String regex = "((\\d{3,4}-)|(\\(\\d{3,4}\\)-)?\\d{7,8})";
System.out.println(str.matches(regex));
}
}
最原始的 第4行 正则是繁琐的,而第5行 正则则是简单的,由于电话号码的前缀是特殊的三种状态:无前缀、有前缀、带括号的前缀;所以我们运用括号来将后两种的前缀状态进行判断,设置了"?" 符号表示正则只使用一次正则。
E-mail地址验证*
地址由字母、数字、下划线组成
hello@word.com(模拟的虚假mail)
用户名要求由字母、数字、下划线、数字点组成,其中必须以字母开头、字母数字做结尾。用户名长度不超过30;而根域名只可以是指定的根域名
public class TestDemo {
public static void main(String [] args) throws ParseException {
String str = "hello@word.com" ;
String regex = "[a-zA-Z]?[a-zA-Z0-9_\\.]{0,28}[0-9a-zA-Z]\\@?\\w+\\.?(com|net|cn|gov|edu|org)";
System.out.println(str.matches(regex));
}
}
java.util.regex 包
Pattern
public class TestDemo {
public static void main(String [] args) throws ParseException {
String str = "hello@word.com" ;
String regex = "\\d+";
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(regex);// 编译正则
String result [] = pattern.split(str); // 拆分字符串
System.out.println(Arrays.toString(result)); //输出结果
}
Matcher
public class TestDemo {
public static void main(String [] args) throws ParseException {
String str = "1234567" ;
String regex = "\\d+";
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(regex);// 编译正则
Matcher mat = pattern.matcher(str); // 进行正则匹配
System.out.println(mat.matches()); // 匹配结果
}
}
Java 正则初探的更多相关文章
- Java正则速成秘籍(一)之招式篇
导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...
- Java正则速成秘籍(二)之心法篇
导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...
- Java正则速成秘籍(三)之见招拆招篇
导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...
- java 正则匹配空格字符串 正则表达式截取字符串
java 正则匹配空格字符串 正则表达式截取字符串 需求:从一堆sql中取出某些特定字符串: 比如配置的sql语句为:"company_code = @cc and project_id = ...
- url 中非法字符替换,java 正则替换
url在传输时不允许的一些字符串,参考自:http://www.ietf.org/rfc/rfc1738.txt 以下字符用java正则替换为"_",一句话搞定: "{& ...
- 通用且常用的Java正则匹配工具,用以检查邮箱名、电话号码、用户密码、邮政编码等合法性
一个通用且常用的Java正则匹配工具,用以检查邮箱名.电话号码.用户密码.邮政编码等合法性. import java.util.regex.Matcher; import java.util.rege ...
- java正则匹配
java正则提取需要用到Matcher类,下面给出案例示例供参考 需要提取车牌号中最后一个数字,比如说:苏A7865提取5,苏A876X提取6import java.util.regex.Matche ...
- Java正则表达中Greedy Reluctant Possessive 的区别
Java正则表达中Greedy Reluctant Possessive 的区别 分类: java2015-01-16 00:28 1280人阅读 评论(9) 收藏 举报 正则表达式Java 目录 ...
- java并发初探ConcurrentSkipListMap
java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...
随机推荐
- DevExpress的LookUpEdit怎样不显示列名
场景 DevExpress的下拉框控件LookUpEdit的使用.添加item选项值.修改默认显示值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/articl ...
- 基于Tomcat部署的Geoserver配置Geowebcache,并转发ArcGIS切片
1.将GeowebCache的war包解压到tomcat的webapp下,打开war包中的WEB-INF中的web.xml文件,同时创建一个你想保存geowencache的切片的空文件夹,例如我命名叫 ...
- Cesium 本地部署案例
众所周知,cesium的服务器是搭建在国外的,所以我们国内的用户访问的时候贼慢.有时想查个api或者看个案例半天都进不去,今天我来说一下傻瓜式搭建本地的cesium环境,用于大家没事查资料用!步骤:1 ...
- android studio学习----目录结构
项目结构:一个窗口只有一个项目,项目 叫 Project 代表一个workspace 一个项目的结构跟eclipse区别还是蛮大的: 首先看APP结构:app放的其实就是 java文件和资源文件 ...
- 精通awk系列(13):print、printf、sprintf和重定向
回到: Linux系列文章 Shell系列文章 Awk系列文章 输出操作 awk可以通过print.printf将数据输出到标准输出或重定向到文件. print print elem1,elem2,e ...
- 4.Redux学习4----react-redux
react-redux是配合redux一起使用的,其中核心组件是Provider Provider是store的提供器,用Provider则store就无需直接引入组件内,而且还可以将一个store公 ...
- React: React集成脚本库Fetch
一.简介 React功能虽然很强大,但是说到底它仍然只是一个简单的创建视图的脚本库,如果想要实现一些更为复杂的业务逻辑,我们还需要使用React搭配其他的脚本库协同工作,以提高应用程序的性能.其中,F ...
- openwrt_在PPPOE上网的同时_访问光猫
openwrt_在PPPOE上网的同时_访问光猫 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-14. 参考文章: 光猫桥接模式下,通过路由器访问光猫.简单设置 设置Open ...
- SecureCRT登陆liunx 方向键失效
使用SecureCRT登陆liunx(CenterOS)系统,发现删除(backspace)键.和上下左右键不起作用,解决如下: 先打开Options–>Session Options–> ...
- winform删除dataGridView列报异常:System.IndexOutOfRangeException:“索引 7 没有值
winform界面如下: using System; using System.Collections.Generic; using System.ComponentModel; using Syst ...