美文网首页
String,正则表达式

String,正则表达式

作者: 云承寒 | 来源:发表于2017-05-13 23:42 被阅读0次

    String

    equals() ==
    重写后比较的是数据内容 引用类型比较地址,基本类型比较本身值

    虚拟机的内存划分为栈、堆、方法区。
    方法区内又为String开辟了一块字符串常量池。

    String str = "测试";
    

    先检查字符串常量池中有没有对应的字符串,有则直接调用,没有则创建。变量地址 str 指向 String 所在的字符串常量池。

    String str = new String("测试");
    

    先检查字符串常量池中有没有对应的字符串,有则直接调用,没则有则创建,并且在堆内存中开辟一块空间,将字符串常量池中的复制一份给堆内存,返回堆内存地址。

    注意
    public static void changed(String str) {
            if ("测试".equals(str)) {
    
            }
    }
    一般在开发中用常量调用equals()去比较,
    因为用变量如果传入Null,会报NullPointerException。
    
    StringBuffer

    1.字符串是常量,它们的值在创建之后不能更改。

    2..字符串的内容不适宜频繁修改,因为字符串的内容一旦发生变化,就会创建一个新的对象,若要频繁修改字符串的内容,建议使用字符串缓冲类。

    StringBuffer 其实就是一个存储字符的容器,底层是依赖一个字符数组做存储,默认构造方法16个字符,如果不够使用,自动增长一倍。

    StringBuffer 和 StringBuilder 的区别

    StringBuffer 可以保证线程安全,但是相应速度慢,而StringBuilder则相反。
    实际开发中一般用StringBuilder,因为很少在线程中频繁操作字符串。


    正则

    正则表达式就是操作字符串的一个规则。

    预定义字符

    任何预定义字符,在没有加上数量之前都只能匹配一个字符。

    预定义字符 作用
    . 任何字符
    \d 数字:[0-9]
    \D 非数字字符(除了0-9):[^0-9]
    \s 空白字符:[\t\n\x08\f\r]
    \s 空白字符:[\t\n\x08\f\r]
    \S 非空白字符:[^\s]
    \w 单词字符[a-zA-Z_0-9]
    \W 非单词字符[^\w]
        public static void main(String[] args) {
    
            /**
             * 预定义字符
             */
            System.out.println("任意字符:" + ("%".matches(".")));
    
            System.out.println("数字字符:" + ("12".matches("\\d\\d")));
    
            System.out.println("非数字字符:" + ("a".matches("\\D")));
    
            System.out.println("空白字符:" + ("\r".matches("\\s")));
    
            System.out.println("非空白字符:" + ("a".matches("\\S")));
    
            System.out.println("单词字符:" + ("a".matches("\\w")));
    
            System.out.println("非单词字符:" + (".".matches("\\W")));
        }
    
    数量词
    数量词 作用
    ? 一次或一次也没有
    * 零次或多次
    + 一次或多次
    {n} 恰好n次
    {n,} 至少n次
    {n,m} 至少n次,但是不超过m次
            public static void main(String[] args) {
    
            /**
             * 数量词
             */
            System.out.println("?一次或一次也没有:" + ("1".matches("\\d?")));
    
            System.out.println("*零次或多次:" + ("11".matches("\\d*")));
    
            System.out.println("+至少出现一次:" + ("11".matches("\\d+")));
    
            // 只能出现十一位
            System.out.println("{次数}恰好出现n次:" + ("11".matches("\\d{11}")));
            // 至少要出现三次,没有上限
            System.out.println("{次数,}至少要出现指定的次数:" + ("111".matches("\\d{3,}")));
            // 指定出现次数为3-4次
            System.out.println("{次数1,次数2指定次数出现的范围}" + "11144".matches("\\d{3,4}"));
        }
    
    字符类(范围词)

    范围词里面不管内容有多长,没有数量词的配合都只能匹配一个字符而已

    范围词 作用
    [abc] 只包含a,b,c
    [^abc] 任何字符,除了a、b或c
    [a-zA-Z] a到z或A到Z,两头的字母包括在内
    [a-d[m-p]] a到d或m到p
    [a-z&&[def]] d、e或f(交集)
    public static void main(String[] args) {
    
            /**
             * 范围词
             */
    
            System.out.println("[abc]:" + "abc".matches("[abc]{3}"));
            
            //除了abc以外
            System.out.println("[abc]:" + "@ss".matches("[^abc]{3}"));
            //字符可以出现a-z,A-Z,$#
            System.out.println("[abc]:" + "ass".matches("[a-zA-Z$#]{3}"));
    
        }
    
    匹配,分割
    public class Run {
        public static void main(String[] args) {
    
            matchesPhone("13390580000");
            mathcesTel("020-12345678");
            spiltTest1();
            spiltTest2();
    
        }
    
        // 匹配手机号,第一位 1开头,第二位3,5,4,7,8,共11位
        public static void matchesPhone(String phone) {
            String reg = "1[34578]\\d{9}";
            System.out.println(phone.matches(reg) ? "合法" : "非法");
        }
    
        // 匹配固定号码,区号-主机号 区号:首位0,长度3-4位 主机号:首位不能为0,长度7-8
        public static void mathcesTel(String tel) {
            String tell = "0\\d{2,3}-[1-9]\\d{6,7}";
            System.out.println(tel.matches(tell) ? "合法" : "非法");
        }
    
        // 切割空格
        public static void spiltTest1() {
            String str = "测      试         切    割";
            String[] arr = str.split(" +");
            System.out.println(Arrays.toString(arr));
    
        }
        
        //根据重叠词切割
        public static void spiltTest2(){
            String str = "红火火火白恍恍恍蓝忽忽";
            //如果正则的内容需要被复用,那么需要对正则的内容进行分组,分组的目的就是为了提高正则的复用性
            //组号不能指定,组号是从1开始,\\1代表引用第一组锁匹配的内容
            String[] arr = str.split("(.)\\1+");
            System.out.println(Arrays.toString(arr));
            
        }
    
    }
    

    相关文章

      网友评论

          本文标题:String,正则表达式

          本文链接:https://www.haomeiwen.com/subject/durfxxtx.html