认识正则表达式
现在假设有一个字符串需要你判断字符串是否由数字组成,如果由数字组成则将变为数字进行乘法运算。
//判断字符串是否全部由文字组成
public static boolean isNumber(String str){
char[] chars = str.toCharArray();
for (char charEach : chars) {
if(charEach>'9'||charEach<'0'){
return false;
}
}
return true;
}
public static void main(String[] args){
String str="124";
if(isNumber(str)){
int num=Integer.parseInt(str);
System.out.println(2*str);
}
}
实际上这种验证得功能是非常简单的,但是如此简单的程序却需要开发者编写大量程序逻辑代码,那么如果是更加复杂的验证呢?那么在这样的情况下,对于验证来讲最好的做法就是利用正则表达式来完成。
public static void main (Stirng []args){
String str="124";
if(str.matches("\\d+")){
}
}
正则表达式最早是从 Perl 语言里面发展而来的,而后在 JDK1.4 以前如果需要使用到正则表达式的相关定义则需要单独引入其他的 jar 文件,但是从 JDK1.4 之后,正则已经默认被 JDK 所支持,并且提供有 java.util.regex 开发包,同时针对于 String 类也提出进行了一些修改,使其可以有方法之间支持正则处理。
使用正则最大特点在于方便进行验证处理,以及方便进行复杂字符串的修改处理。
常用正则标记
如果要想进行正则的处理操作,那么就首先需要对常用的正则标记有所掌握,从JDK1.4 开始提供有 java.util regex 开发包,里边定义这个包里面提供有一-个Pattern 程序类,在这个程序类里面定义有所有支持的正则标记。
-
【数量:单个】字符匹配
- 任意字符: 表示由任意字符组成
- \: 匹配””
- \n: 匹配换行
- \t: 匹配制表符
-
【数量:单个】字符集(可以从里面任意选择一个字符)
-
[abc]: 表示可能是字母a b c 中的任意一个
-
-
【数量:单个】简化字符集
- . : 表示任意一个字符
- \d : 等价于”0-9“范围
- \D: 等价于”[ ^0 -9]” 范围
- \s: 匹配任意一位空格 可能是空格、换行、制表符
- \S: 匹配任意的非空字符
- \w: 匹配字母 数字 下划线 等价于“[a-zA-Z_0-9]
- \W: 匹配非字母 数字 下划线
-
边界匹配
- ^: 匹配边界开始
- $: 匹配边界结束
-
数量表示。默认情况下只有添加了数量单位才可以匹配多位字符
- 表达式?: 该正则可以出现0次或者多次
- 表达式+: 该正则可以出现一次或多次
- 表达式*: 该正则可以出现0次 一次或多次
- 表达式{n}: 表达式的长度正好为次
- 表达式{n}: 表达式的长度为n次以上
- 表达式{n-m}: 表达式的长度在n-m次
-
逻辑表达式: 可以连接多个正则:
- 表达式X 表达式Y: X表达式之后紧跟Y表达式
- 表达式X|Y: 有一个表达式满足即可
- (表达式): 为表达式设置一个整体描述 可以为整体描述设置数量单元
String 类对正则得支持
在进行正则表达式大部分处理的情况下都会基于Spring类来完成,并且在spring类里提供有如下与正则有关的操作。
-
将指定字符串进行正则判断
public boolean matches(String regex)
-
替换全部
public String replaceAll(String regex,String replacement)
-
替换首个
public String replaceFirst(String regex,String replacement)
-
正则拆分
public String[] split(String regex)
-
正则拆分 拆分成指定的个数
poublic String[] split(String regex,int limit)
示例 实现字符串替换(删除非字母和数字)
String str="jjagj&*%$hj#^";
String regex="[^a-zA-Z0-9]+";
System.out.println(str.replaceAll(regex," "));
示例 是啊字符串的拆分
String str="a1b22c333";
String regex="\\d+";//正则表达式 要注意使用\\d+和\\d的区别
String result[]=str.split(regex);
for(int x=0;x<result.length;x++){
System.out.print(result[x]+"、");
}
在正则处理的时候替换和拆分的操作相对简单一点,比较麻烦的是数据验证部分。
示例 判断一个数据是否是小数 如果是小数则则将其转换为double
String str="111.11";
String regex="\\d+(\\.\\d+)?";//小数点和小数位同时出现
System.out.println(str.matches(regex));
示例 判断一个字符串是否由日期所组成,如果由日期所组成将其转换为data类型
String str="2019-10-11";
String regex="\\d{4}-\\d{2}-\\d{2}";
if(str.matches(regex)){
System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(str));
}
许哟啊注意的是正则无法对里面的内容进行判断,只能够对格式进行判断
示例 判断给定的电话号码是否正确
电话号码: 51283346 \\d{7,8}
电话号码: 01051283346 (\\d{3,4})?
电话号码: (010)-51283346。\(\\d{3,4}\)
String str="(010)51283346";
String regex="((\\d{3,4})|(\\(\\d{3,4}\\)))?\\d{7,8}";
System.out.println(str.matches(regex));
示例 验证email地址格式
email的用户名可以由字母、数字、下划线所组成(不应该以_开头)
email 的域名可以由字母、数字、_、-所组成
域名的后缀必须是.cn 、.com 、 .net、.com.cn、.gov所组成
String str="12345@qq.com";
String regex="[a-zA-Z0-9]\\w+@\\w+\\.(cn|com|com.cn|gov)";
System.out.println(str.matches(regex));
java.util.regex包支持
虽然在大部分的情况下都可以以利用 String 类实现正则的操作,但是也有一 些情况下需要使用到 java.util.regex 开发包中提供的正则处理类。
在这个包里面一共定义有两个类: Pattern (正则表达式编译)、Matcher (匹配)。
-
Parttern 类提供由正则表达式的编译类支持:public static Pattren complie(String regex)
同时也提供由字符串的拆分操作: public String [] split(CharSequence input)
String str="haghhag*hahg&^%hhhkk"; String regex="[^a-zA-Z]+"; Pattern pat=Pattern.compile(str);//编译正则表达式 String[] split = pat.split(regex);
-
Matcher类实现正则匹配的处理类,这个类对象的实例化依赖Pattern来完成.
Partten类中提供的方法 public Matcher matcher(CharSequence input)
当获取到Matcher类的对香港之后就可以利用该类中的方法进行如下操作
//正则匹配 public boolean matchers() //字符串替换 public String repalceAll(String replacement)
示例 字符串匹配
String str="101";
String regex="\\d+";
Pattern pat=Pattern.compile(regex);//编译正则表达式
Matcher matcher = pat.matcher(str);
System.out.println(matcher.matches());
如果纯粹是以拆分、替换、匹配三种操作为例根本用不到java.util.regex开发包,只依赖String类就可以实现了,但是matcher类中提供由一种分组的功能,而这种分组的功能是String不具备的。
// 要求取出#{}标记中的所有内容
String str="INSERT INTO dept(deptno,dname,loc) values(#{deptno},#{dname},#{loc}})";
String regex="#\\{\\w+\\}";
Pattern pat = Pattern.compile(regex);
Matcher matcher = pat.matcher(str);
while(matcher.find()){//是否由匹配成功的内容
//分组
// #{deptno}#{dname}#{loc}
System.out.print(matcher.group());
// deptnodnameloc
Syst
java.util.regex开发包如果不是进行一些更为复杂的正则处理是很难用到的,而String 类所提供的功能只适合于简单的正则操作。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/107584.html