zoukankan      html  css  js  c++  java
  • 黑马程序员 Java正则表达式,详解反斜线在Java中的作用

    ---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

    在程序设计过程中,经常需要对获取的数据进行检查是否符合特定的格式,如此频繁地对数据进行检查使用人工检查简直就是灾难,而自己编写程序检查又显得非常麻烦。比如检查一个输入的电子邮件地址是否正确,自己编程实现检查操作至少需要10行代码并且效率也不一定很好,这时候咋办?正则表达式!!

    验证邮箱地址的合法性

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class RegexTest {
    
    	public static void main(String[] args) {
    		String mialAddress = "";
    		boolean bool = false;
    		BufferedReader bufIn = null;
    		System.out.print("Please input your Email :");
    		String reg = "[a-zA-Z0-9-_.]+@[a-zA-Z-1-9]+(\.[a-zA-Z]+){1,3}";
    		do {
    			bufIn = new BufferedReader(new InputStreamReader(System.in));
    			try {
    				mialAddress = bufIn.readLine().trim();
    			} catch(IOException e) {
    				e.printStackTrace();
    			}
    			bool = mialAddress.matches(reg);
    			System.out.println(bool);
    			if(!bool)
    				System.out.println("Error! Please try again :");
    		} while(!bool);
    	}
    }


    上面的小程序让用户输入一个邮箱地址,经检查之后输出结果,如果为合法的地址则程序结束,如果非常则再循环一次重新输入直至正确为止。

    上面可能陌生的只有两点,一是字符串reg的规则即正则表达式声明规则,二是String类的matches方法。

    String类的matches方法其实也很简单,就是告知此字符串是否匹配给定的正则表达式,其底层是这样实现的,

    Pattern.matches(regex, str)

    Pattern

    Pattern类是正则表达式的编译表示形式,该类没有构造方法,要想获取该类对象可通过其静态方法compilePattern类的一个方法matcher可获得匹配器又称为匹配引擎Matcher

    Pattern类的实例不可变,可供多个并发线程安全使用。Matcher类的实例用于此目的则不安全。

    Matcher

    Matcher中提供了对字符串的匹配,替换,切割,获取四大功能,学习正则表达式除了表达式声明规则,这个类的各种方法也是要重点了解的。

    反斜线‘ ’转义和引用

    在初期运用正则表达式的时候可能竟然因为对‘‘不理解而产生不必要的错误,这个字符在Java中是非常特殊的,它的作用就是转义和引用。

    引用:反斜线用于引用其他将被解释为非转义构造的转义字符,这话的确很拗口,仔细分析其实是不难理解的,比如想要声明一个内容为一对英文符号的双引号的字符串,也就是””,那么如何声明呢?如果直接这样声明

    String str = “”””;

    编译器是肯定不通过的,因为在Java中双引号是转义字符,也就是说单一个双引号表示的并非其原意,那么我们如何声明呢?其实很简单只要改成这样就解决了。

    String str = “”””;

    我们要将一个双引号原本的意思表示出来使用反斜线即可,也就是说JVM中被认作为字符串的声明符号类似于操作运算符,而前面加上一个反斜线就是告诉JVM我要双引号的文本意思(也就是上面那句话中的解释为非转义构造),即一个符号。

    转义:反斜线同时也可以用于引用转义构造,举一个最简单的例子,n原本没有任何其他意思,也就是非转义字符,而前面加上,变为 就代表一个换行符,这时反斜线就把n“转义“了,注意这里的 是事先声明过的,如果来一个v在编译时就会报错。在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否是非转义构造的一部分。当然如果要解释非转义的其本身,可以这样\

    IP地址检验合法性

    这里要求是根据windows系统错误提示推断的,可能有一定误差,不过万变不离其宗,只要掌握了核心思想,再怎么变化也不怕。该程序实现的IP格式要求如下:

    (1-223).(0-255).(0-255).(0-255)            例如122.201.53.56是合法的,而225.15.15.15就是不合法的。

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class CheckIPAddressTest {
    	public static void main(String[] args) {
    		String ipAddress = "";
    		boolean bool = false;
    		BufferedReader bufIn = null;
    		System.out.print("Please input IPAddress :");
    		String reg =
    				"^([1-9]|[1-9]\d|1\d{2}|2[0-1]\d|22[0-3])\." + 
    				"(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\." + 
    				"(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\." + 
    				"(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$";
    		do {
    			bufIn = new BufferedReader(new InputStreamReader(System.in));
    			try {
    				ipAddress = bufIn.readLine().trim();
    			} catch(IOException e) {
    				e.printStackTrace();
    			}
    			bool = ipAddress.matches(reg);
    			System.out.println(ipAddress);
    			System.out.println(bool);
    			if(!bool)
    				System.out.println("Error! Please try again :");
    		} while(!bool);
    	}
    }


     

    这个程序是根据上面那个检验邮箱地址程序稍作修改得到的,不过这里的正则表达式声明稍微费点事情。我总感觉这个正则表达式有点长,程序执行起来未必有自己实现代码高效,大家可以自己用比较运算方式实现这个程序,比较一下各自花费的时间长短。

     

  • 相关阅读:
    Codeforces 1009F Dominant Indices
    C++之++运算符重载问题
    Codeforces 1010D Mars rover
    这是一个开始
    MoreEffectiveC++Item35(异常)(条款9-15)
    C++隐式类类型转化
    MoreEffectiveC++Item35(操作符)(条款5-8)
    MoreEffectiveC++Item35(基础议题)(条款1-4)
    php+mysql网站无限级栏目分类-递归获取树形结构函数
    JavaScript简易动画
  • 原文地址:https://www.cnblogs.com/pangblog/p/3339443.html
Copyright © 2011-2022 走看看