正则表达 初探*

走进沼泽

问题引出

  • 问题:判断一个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 正则初探的更多相关文章

  1. Java正则速成秘籍(一)之招式篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  2. Java正则速成秘籍(二)之心法篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  3. Java正则速成秘籍(三)之见招拆招篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  4. java 正则匹配空格字符串 正则表达式截取字符串

    java 正则匹配空格字符串 正则表达式截取字符串 需求:从一堆sql中取出某些特定字符串: 比如配置的sql语句为:"company_code = @cc and project_id = ...

  5. url 中非法字符替换,java 正则替换

    url在传输时不允许的一些字符串,参考自:http://www.ietf.org/rfc/rfc1738.txt 以下字符用java正则替换为"_",一句话搞定: "{& ...

  6. 通用且常用的Java正则匹配工具,用以检查邮箱名、电话号码、用户密码、邮政编码等合法性

    一个通用且常用的Java正则匹配工具,用以检查邮箱名.电话号码.用户密码.邮政编码等合法性. import java.util.regex.Matcher; import java.util.rege ...

  7. java正则匹配

    java正则提取需要用到Matcher类,下面给出案例示例供参考 需要提取车牌号中最后一个数字,比如说:苏A7865提取5,苏A876X提取6import java.util.regex.Matche ...

  8. Java正则表达中Greedy Reluctant Possessive 的区别

    Java正则表达中Greedy Reluctant Possessive 的区别 分类: java2015-01-16 00:28 1280人阅读 评论(9) 收藏 举报 正则表达式Java   目录 ...

  9. java并发初探ConcurrentSkipListMap

    java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...

随机推荐

  1. 使用docker运行dotnetcore站点

    使用docker运行netcore站点 1.新建一.netcore测试站点,dotnet publish 发布到publish目录下 2.编写Dockerfile文件 3.打包上传到centos服务器 ...

  2. 分布式系统的发展演变以及RPC简介

    场景 什么是分布式系统 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统. 分布式系统是建立在网络之上的软件系统. 注: 博客: https://blog.csdn.net/b ...

  3. injected stylesheet 谷歌扩展插件,造成样式异常

    今天在开发的时候,遇到一个问题,就是我们我在写发送广告的功能,然后我用了一个textare文本框,这个时候,发现了一个问题.这个文本框凭空消失了.不见了,我以为是自己的那个样式不小心把这个隐藏掉了后来 ...

  4. Castle DynamicProxy基本用法(AOP)

    本文介绍AOP编程的基本概念.Castle DynamicProxy(DP)的基本用法,使用第三方扩展实现对异步(async)的支持,结合Autofac演示如何实现AOP编程. AOP 百科中关于AO ...

  5. JavaScript图形实例:布纹图案

    1.椭圆型布纹图案 先在HTML页面中设置一个画布. <canvas id="myCanvas" width="300" height="300 ...

  6. go路由httprouter中的压缩字典树算法图解及c++实现

    目录 go路由httprouter中的压缩字典树算法图解及c++实现 前言 httprouter简介 压缩字典树 概念 插入操作 查询操作 c+++实现 go路由httprouter中的压缩字典树算法 ...

  7. 苹果_公司开发者账号_申请DUNS number

    申请DUNS number 注意事项:a.公司英文名称,例如:北京京城科技有限公司,Beijing Jingcheng Technology Co., Ltd.(Co.和Ltd.都是缩写,中间用“逗号 ...

  8. A Code Farmer‘s Entertainment

    My guitar playing and singing 码农的自娱自乐 https://v.youku.com/v_show/id_XNDM4NTY1MTEwNA==.html?spm=a2hzp ...

  9. LeetCode刷题191127

    数据库: 1179 部门表 Department: +---------------+---------+| Column Name | Type |+---------------+-------- ...

  10. idea中git分支、合并与使用

    1.分支的新建与合并使用场景介绍 让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流. 你将经历如下步骤: 开发某个网站. 为实现某个新的需求.问题(#53问题),创建一 ...