浅度解密正则表达式—字符串利器

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

我们都知道在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());
                   }
         }
}


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值