正则表达式

    写一个功能实现QQ号码的校验。
import java.util.Scanner;

public class RegexDemo01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的QQ号码:");
String str = sc.nextLine();
boolean f = queckQQ(str);
System.out.println("result:"+f);
}
public static boolean queckQQ(String qq) {
boolean flag = true;
if (qq == null || qq.length() == 0)
flag = false;
if (qq.length() >= 5 && qq.length() <= 15){
if(!qq.startsWith("0")){
char[] ch = qq.toCharArray();
for(int i = 0; i < ch.length;i++){
char c = ch[i];
if (!Character.isDigit(c)){
flag = false;
}
}
}else{
flag = false;
}
}else{
flag = false;
}
return flag;
}
}
只是一个功能比较简单的校验却需要那么多的代码,非常的麻烦,下面学习正则表达式。
   
1、正则表达式概述及基本使用
    正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
import java.util.Scanner;

public class RegexDemo02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的QQ号码:");
String str = sc.nextLine();
boolean f = queckQQ(str);
System.out.println("result:"+f);
}
public static boolean queckQQ(String qq) {
String regex = "[1-9][0-9]{4,14}";
boolean flag = qq.matches(regex);
return flag;
//return qq.matches("[1-9][0-9]{4,14}");
}
}
 
3、正则表达式的组成规则
        规则字符在java.util.regex Pattern类中    常见组成规则

        · 字符
            x 表示字符x。举例:‘a’ 表示字符a
            \\ 表示反斜线字符
            \n 表示新行(换行)符(‘\u000A’)

\r 表示回车符('\u 000D')

    · 字符类

            [abc] 表示a 、b、c(简单类)
            [^abc] 表示任何字符,除了a、b或c(否定)

[a-zA-Z] 表示a到z 或A到Z,两头的字母包括在内(范围)

    [0-9] 表示0到9的字符都包括

        · 预定义字符类
            . 表示任何字符
            \d 表示数字:[0-9]
            \D 表示非数字:[^0-9]
            \w 表示单词字符:[a-zA-Z_0-9],在正则表达式里面组成单词的东西必须有这些东西组成
            \W 表示非单词字符
 
        · 边界匹配器
            ^ 表示行的开头
            $ 表示行的结尾
            \b 表示单词边界,就是不是单词字符的地方。
                举例:hello world?haha;xixi

 · 数量词

? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
   
 
 
 
 
 
 
 
3、正则表达式的应用
      · 判断功能  public boolean matches(String regex)       
  · 分割功能  public String[] split(String regex)       
  · 替换功能  public String replaceAll(String regex,String replacement)       
  · 获取功能  Pattern和Matcher类的使用
 

1)匹配方法  matches

public static boolean matches(String regex, CharSequence input)

编译给定正则表达式并尝试将给定输入与其匹配。

调用此便捷方法的形式

Pattern.matches(regex, input);

与表达式

Pattern.compile(regex).matcher(input).matches() 

的行为完全相同。

如果要多次使用一种模式,编译一次后重用此模式比每次都调用此方法效率更高。

参数:
regex - 要编译的表达式
input - 要匹配的字符序列
抛出:
PatternSyntaxException - 如果表达式的语法无效
  举例1:校验手机号码。要求:11位,18或13开头。
 *                     13436975980
 *  13688886868
 *  13866668888
 *  13456789012
 *  13123456789
 *  18912345678
 *  18886867878
 *  18638833883
import java.util.Scanner;
public class RegexDemo03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的手机号码:");
String phone = sc.nextLine();
boolean f = queckTelPhone(phone);
System.out.println("result:"+f);
}
public static boolean queckTelPhone(String phone) {
String regex = "1[38]\\d{9}";
return phone.matches(regex);
}
}

  举例2:校验邮箱。

import java.util.Scanner;
/**
* 定义邮箱的规则
* 1517806580@qq.com
* liuyi@163.com
* linqingxia@126.com
* fengqingyang@sina.com.cn
* fqy@itcast.cn
*/
public class RegexDemo04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的邮箱:");
String email = sc.nextLine();
boolean f = queckEmail(email);
System.out.println("result:"+f);
}
public static boolean queckEmail(String email) {
String regex = "\\w+@\\w{2,6}(\\.\\w{2,3})+";
return email.matches(regex);
}
}

2)分割功能 split

    public String[] split(CharSequence input, int limit)
围绕此模式的匹配拆分给定输入序列。

此方法返回的数组包含输入序列的子字符串,由匹配此模式的另一子序列或输入序列的结尾终止。数组中子字符串的顺序与其在输入中出现的顺序相同。如果此模式与输入的任何子序列都不匹配,那么得到的数组仅包含一个元素,即字符串形式的输入序列。

limit 参数控制应用模式的次数,从而影响结果数组的长度。如果限制 n 大于零,那么模式至多应用 n> - 1 次,数组的长度不大于 n,并且数组的最后条目将包含除最后的匹配定界符之外的所有输入。如果 n 非正,那么将应用模式的次数不受限制,并且数组可以为任意长度。如果 n 为零,那么应用模式的次数不受限制,数组可以为任意长度,并且将丢弃尾部空字符串。

 
举例3:            
  百合网,世纪佳缘,珍爱网,QQ
  搜索好友            
  性别:女            
  范围:"18-24",age>=18 && age<=24
import java.util.Scanner;

public class RegexDemo05 {
public static void main(String[] args) {
//定义一个年龄搜索范围
String ages = "18-24";
//定义规则
String regex = "-";
//调用方法
String[] strArray = ages.split(regex);
//如何得到int类型的呢?
int startAge = Integer.parseInt(strArray[0]);
int endAge = Integer.parseInt(strArray[1]);
//键盘录入年龄
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
if(age>=startAge && age<=endAge) {
System.out.println("你就是我想找的");
}else {
System.out.println("不符合我的要求,gun");
}
}
}

  举例4:直接分割

public class RegexDemo06 {
public static void main(String[] args) {
// 定义一个字符串
String s1 = "aa,bb,cc";
// 直接分割
String[] str1Array = s1.split(",");
for (int x = 0; x < str1Array.length; x++) {
System.out.println(str1Array[x]);
}
System.out.println("---------------------");
String s2 = "aa.bb.cc";
String[] str2Array = s2.split("\\.");
for (int x = 0; x < str2Array.length; x++) {
System.out.println(str2Array[x]);
}
System.out.println("---------------------");
String s3 = "aa bb cc";
String[] str3Array = s3.split(" +");
for (int x = 0; x < str3Array.length; x++) {
System.out.println(str3Array[x]);
}
System.out.println("---------------------");
//硬盘上的路径,我们应该用\\替代\
String s4 = "E:\\JavaSE\\day14\\avi";
String[] str4Array = s4.split("\\\\");
for (int x = 0; x < str4Array.length; x++) {
System.out.println(str4Array[x]);
}
System.out.println("---------------------");
}
}
 
  举例5:
/*
 * 我有如下一个字符串:"91 27 46 38 50"
 * 请写代码实现最终输出结果是:"27 38 46 50 91"
 * 分析:
 *  A:定义一个字符串
 *  B:把字符串进行分割,得到一个字符串数组
 *  C:把字符串数组变换成int数组
 *  D:对int数组排序
 *  E:把排序后的int数组在组装成一个字符串
 *  F:输出字符串
 */
import java.util.Arrays;
public class RegexDemo07 {
public static void main(String[] args) {
String s = "91 27 46 38 50";
String[] strArray = s.split(" ");
int[] arr = new int[strArray.length];
for (int x = 0; x < strArray.length; x++){
arr[x] = Integer.parseInt(strArray[x]);
}
Arrays.sort(arr);
StringBuilder sb = new StringBuilder();
for(int x = 0; x < arr.length; x++){
sb.append(arr[x]).append(" ");
}
String result = sb.toString().trim();
System.out.println("result:"+result);
}
}
 
3)替换功能
          String类的public String replaceAll(String regex,String replacement)
    用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
public class RegexDemo08 {
public static void main(String[] args) {
String s = "helloqq12345worldkh622112345678java";
String regex = "\\d";
String ss = "*";
String result = s.replaceAll(regex,ss);
System.out.println("result:"+result);
}
}
4)获取功能
    Pattern和Matcher类的使用
    模式和匹配器的基本使用顺序
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo09 {
public static void main(String[] args) {
// 模式和匹配器的典型调用顺序
// 把正则表达式编译成模式对象
Pattern p = Pattern.compile("a*b");
// 通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串
Matcher m = p.matcher("aaaaab");
// 调用匹配器对象的功能
boolean b = m.matches();
System.out.println(b);
//以上是判断功能,太麻烦了,我们直接用字符串的方法做
String s = "aaaaab";
String regex = "a*b";
boolean bb = s.matches(regex);
System.out.println(bb);
}
}
    举例:
          获取下面这个字符串中由三个字符组成的单词
   da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by gao on 15-12-5.
*/
public class RegexDemo10 {
public static void main(String[] args) {
// 定义字符串
String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";
// 规则 \\b表示单词边界,边界不允许出现单词字符
String regex = "\\b\\w{3}\\b";
// 把规则编译成模式对象
Pattern p = Pattern.compile(regex);
// 通过模式对象得到匹配器对象
Matcher m = p.matcher(s);
// 调用匹配器对象的功能
// 通过find方法就是查找有没有满足条件的子串
// public boolean find()
while (m.find()) {
System.out.println(m.group());
}
// 注意:一定要先find(),然后才能group()
// IllegalStateException: No match found
// String ss = m.group();
// System.out.println(ss);
}
}

Java API —— Pattern类的更多相关文章

  1. Java API 常用类(一)

    Java API 常用类 super类详解 "super"关键字代表父类对象.通过使用super关键字,可以访问父类的属性或方法,也可以在子类构造方法中调用父类的构造方法,以便初始 ...

  2. Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能

    Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能. 下面是个例子: import org.junit.Test; import java. ...

  3. es2.4.6 java api 工具类

    网上找了很久没找到2.4.X 想要的java api 工具 自己写了一个,分享一下 导入所需的jar <!-- ElasticSearch begin --> <dependency ...

  4. java之Pattern类详解

    在JDK 1.4中,Java增加了对正则表达式的支持. java与正则相关的工具主要在java.util.regex包中:此包中主要有两个类:Pattern.Matcher. Pattern  声明: ...

  5. Java API —— DateFormat类

    1.DateFormat类概述         DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间. 是抽象类,所以使用其子类SimpleDateForm ...

  6. Java—API/Obiect类的equals toString方法/String类/StringBuffer类/正则表达式

    API  Java 的API(API: Application(应用) Programming(程序) Interface(接口)) 就是JDK中提供给我们使用的类,这些类将底层的代码实现封装了起来 ...

  7. Java API ——StringBuffer类

    1.StringBuffer类概述 1)我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间.而StringBuffer就可以解决这个问题 2)线程安全的可变字 ...

  8. Java API —— File类

    1.File类的概述         文件和目录路径名的抽象表示形式,创建File对象后,仅仅是一个路径的表示,不代码具体的事物一定是存在的. 2.构造方法         · public File ...

  9. Java API —— Collections类

    1.Collections类概述         针对集合操作 的工具类,都是静态方法   2.Collections成员方法         public static <T> void ...

随机推荐

  1. (转)Windows驱动编程基础教程

    版权声明     本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括 ...

  2. [转]null和""以及==与equals的区别

    String str1 = null; str引用为空 String str2 = ""; str引用为空串 直接点就是null没有分配内存空间,而""分配了内 ...

  3. Oracle查询出最最近一次的一条记录

    需求:从一个表中查询数据,得到的数据为最新的一条记录. -------------建立测试表 --drop table TB ),dtDate date) -------------插入测试数据 ,' ...

  4. JAVA读取TXT文本中的数据

    现在在Demo.txt中存在数据: ABC 需要将ABC从文本文件中读取出来 代码片: import java.io.*; class FileReaderDemo { public static v ...

  5. 转字符驱动实例gpio

    概述: 字符设备驱动程序: 是按照字符设备要求完成的由操作系统调用的代码. 重点理解以下内容:  1. 驱动是写给操作系统的代码,它不是直接给用户层程序调用的,而是给系统调用的  2. 所以驱动要向系 ...

  6. 【linux】

    virtualbox   hyper-v     vmware      KVM      LXC Utils       Docker

  7. 11.1Daily Scrum

    人员 任务分配完成情况 明天任务分配 王皓南 主网页的框架搭建,任务编号760 研究代码,学习相应语言,讨论设计思路 申开亮 学习数据库的操作,任务编号761 研究代码,学习相应语言,讨论设计思路 王 ...

  8. MAC 13信道

    房东的路由器一直连不上,手机却能连上,前天设置了13信道,后来又忘了,最后找到个连接WIFI的方法,在网络偏好设置里选择向导,诊断中可以连上wifi.

  9. qsort/bsearch的应用

    问题描述: Description You have just moved from Waterloo to a big city. The people here speak an incompre ...

  10. 【HDOJ】【3853】LOOPS

    概率DP/数学期望 kuangbin总结中的第7题 其实跟UVA 11762 Race To 1 那道题差不多……直接推下公式,然后倒推即可 Trick:有的点可能是p1[i][j]==1……这样的点 ...