正则表达 初探*

走进沼泽

问题引出

  • 问题:判断一个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. 如何编写一个TS程序?

    第一步:我们首先需要个代码编辑器-VSCode  点击此处下载(你会下载到rar文件) 第二步:我们还需要下载NodeJS,因为这里有npm,npm是包管理工具,可以下载TypeScript. 注意: ...

  2. Elasticsearch7.5.0源码编译

    环境及工具 JDK12 Gradle5.6.2 GIT 源码及预处理 到github将代码clone下来,可以根据自己的需求来获取版本,例如 git checkout v7.5.0 提前下载gradl ...

  3. ANSIBLE安装和常用模块模块使用详细教程

    目录 ANSIBLE安装和各种模块应用功能 安装配置ANSIBLE ANSIBLE使用 ansible-galaxy工具 ansible-pull工具 ansible-playbook ansible ...

  4. eth-trunk学习笔记

    转载自https://blog.csdn.net/qq_38265137/article/details/80404340

  5. C# 使用.net core 驱动树莓派的IO信号

    如何使用.net core来驱动树莓派的IO信号?是我们的实际项目需求中,可能就会有这种小项目,我们要输出一个IO信号,此处我们拿了树莓派4做测试 一共有两排引脚,引脚的顺序定义及功能如下: 我们就参 ...

  6. C#通过反射调用类及方法

    反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类).下面演示一下通过反射调用类及方法: 1.新建一个类,命名为:ReflectionHelper,代码如下: #region 创 ...

  7. C#使用Linq to csv读取.csv文件数据

    前言:今日遇到了一个需要读取CSV文件类型的EXCEL文档数据的问题,原本使用NPOI的解决方案直接读取文档数据,最后失败了,主要是文件的类型版本等信息不兼容导致.其他同事有使用linq to csv ...

  8. Axure制作dialog效果的动作步骤

    1.在Axure中添加一个弹框按钮  2.将动态面版拖动到界面中    3.双击动态面版,双击state  4.拖入一块图片占位符进来    5.设置图片  6.回到上一个界面设置动态面版的大小,使其 ...

  9. SpringCloud之Zuul:服务网关

    Zuul在Web项目中的使用见上文<SpringBoot中使用Zuul>,下面例子为Zuul在Spring Cloud的使用. 开发工具:IntelliJ IDEA 2019.2.3 一. ...

  10. Dotnetcore安装nuget包时不能使用content中的文件

    问题:用NUGET打包了一个asp.netcore的项目,试图安装到另一个asp.netcore项目中,除了自动添加引用外,还希望自动释放一些文件以供修改.这些操作以前在netframe中是正常的,脚 ...