今天我来和大家来谈谈关于字符串相关的问题,该篇文章适合小白学习,大牛请止步,毕竟博主对正则表达式也只是了解皮毛,也许以我目前的水平不适合写这篇博文,但是!任何大牛都是从菜鸟慢慢爬上去的 →_→
我们都知道在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());
}
}
}
由于时间关系今天就到这了。