博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅度解密正则表达式—字符串利器
阅读量:3673 次
发布时间:2019-05-21

本文共 2940 字,大约阅读时间需要 9 分钟。

今天我来和大家来谈谈关于字符串相关的问题,该篇文章适合小白学习,大牛请止步,毕竟博主对正则表达式也只是了解皮毛,也许以我目前的水平不适合写这篇博文,但是!任何大牛都是从菜鸟慢慢爬上去的 →_→

我们都知道在java中的API文档提供了很多对字符串进行操作的方法,比如 增 删 改等等方法,但是这些方法只能简单的处理一下字符串,如果我们要判断某种特殊格式的时候,只是使用这些方法进行操作的时候会很吃力(如邮箱,日期等等的格式),如果对这些方法不熟悉,可能会判断不正确,但是从标题你们应该就知道了,正则表达式可以轻松的解决这类问题。

在正则表达式中有用到这2个类:

1、Pattern

2、Matcher

Pattern该类没有公共的构造函数(也就是不能实例化对象),要使用该类要先调用其静态方法,返回一个Pattern对象,该对象的参数是一个正则表达式

Matcher该类是接受用户输入的数据并进行自动匹配的引擎,和Pattern类一样没有公共的构造函数,要调用其静态方法返回对象。

下面就是一个简单的正则表达式:

class  Test

{
 public static void main(String[] args) {
System.out.println("1".matches("\\d"));
}
}

答案是true,因为//d这个正则表达式代表着一个数字,条件满足所有返回是true,如果不满足这个正则表达式则会返回false.

上面只是简单的写法且效率不高。

import java.util.regex.*;

class  Test
{
public static void main(String[] args) {
//System.out.println("1".matches("\\d"));
show("1");
}
public static void show(String string){
Pattern p = Pattern.compile("\\d");
Matcher m = p.matcher(string);
System.out.println(m.matches());
}
}

以上才是正则表达式正常写法,因为是Pattern 和 Matcher是regex包中所以要先导入,否则会编译失败,且该写法的效率高于上方的简化写法,可能你会问这是为什么,因为正常是写法是事前就先对正则表达式进行编译了,就是上方的Pattern.compile("\\d");而简化的写法则没有编译,所以从效率上高于简化版。

现在大家可能对正则表达式有一个模糊的概念,正则表达式个人理解就是一个搜索引擎,我们只需要将需要搜索的内容给它,然后等待结果,说道这我们来谈谈怎么写符合这个搜索引擎内容的正则表达式。

我们打开API文档,搜索Pattern这个索引,该类会有很多正则表达式的写法,如:

/d:匹配一个0-9的数字,而我的写法是//d多一个/ 这是为什么?因为在java中 / 有着转义字符这一含义所以要用两个//。

[a-z]: 匹配一个字符,只要是a-z的字符,什么意思了?如果用这个正则表达,你输入的字符串如果是单个字母且是a-z则会返回true如果不是属于该字母且多个字母就会返回false

[^a-z]:匹配一个字符,不是a-z之间的字母,这个正则表达和上面的完全相反,表示你输入的数据只要不是a-z的其他任何字符串,就会返回true,如果是a-z其中的字母就会返回false

我也就介绍到这,上面基本解释和大白话也差不多,我就不一一解释了,Pattern介绍就到这,下面咱们来谈谈Matcher,该类主要提供了一些方法如下:

简单介绍下其中几个方法。

find();:该方法匹配的是输入的字符串中是否包含正则表示,什么意思了?比如我们要一个A但是用户输入的字符串是ABCABC,该方法会先一个一个的找,如果找到其中有A就会返回true,只要有就OK,该方法需要注意的是,find每找到匹配的字符就会被吃掉,如果下次再继续找的时候字符串中就找不到前面已经找的字符了,就像下列代码,第一循环找到了4个匹配的,第2循环却一个也没找到。

group():返回匹配到的数据。

import java.util.regex.*;

class  Test
{
public static void main(String[] args) {
show("1asa23asda2");
}
public static void show(String string){
Pattern p = Pattern.compile("\\d");
Matcher m = p.matcher(string);
while(m.find()){
System.out.println(m.group());
}
System.out.println("----------------");
while(m.find()){
System.out.println(m.group());
}
}
}

答案:

如果想要全部显示,使reset();

import java.util.regex.*;

class  Test
{
          public static voidmain(String[] args) {
                  
                   show("1asa23asda2");   
         }

         public static void show(Stringstring){
                   Pattern p =Pattern.compile("\\d");
                   Matcher m =p.matcher(string);
                  
                   while(m.find()){
                            System.out.println(m.group());
                   }

                   m.reset();//返回前面被吃掉的数据

                   System.out.println("----------------");
                   while(m.find()){
                            System.out.println(m.group());
                   }
         }
}

答案:

start():返回找到匹配当前位置的下标。

end():返回找到匹配结束出现的位置的下标

 

import java.util.regex.*;

class  Test
{
          public static voidmain(String[] args) {
                  
                   show("1asa23asda2");   
         }
         public static void show(Stringstring){
                   Pattern p =Pattern.compile("\\d");
                   Matcher m =p.matcher(string);
                  
                   while(m.find()){
                            System.out.println(m.start());
                   }

                   m.reset();//返回前面被吃掉的数据

                   System.out.println("----------------");
                   while(m.find()){
                            System.out.println(m.end());
                   }
         }
}

由于时间关系今天就到这了。

你可能感兴趣的文章
c++右值引用
查看>>
B树的实现
查看>>
多路归并与败者树的简单实现
查看>>
tcp 总结
查看>>
UDP总结
查看>>
mysql 存储引擎
查看>>
动态规划解决贴纸拼字游戏
查看>>
求网络中两点之间的路径
查看>>
一个模拟的负载均衡系统的实现
查看>>
数字化婚姻配对尝试
查看>>
mysql事务
查看>>
mysql 优化
查看>>
select poll epoll区别
查看>>
继承与多态
查看>>
简单工厂模式
查看>>
守护进程的创建步骤
查看>>
epoll下 LT与ET的区别
查看>>
工厂方法模式
查看>>
抽象工厂模式
查看>>
代理模式
查看>>