zoukankan      html  css  js  c++  java
  • java 字符串与正则表达式

    1.String 对象是不可变的,每个试图修改String值得方法,实际上都是创建了一个全新的String对象。

    public class StringTest {
        public static String upcase(String s){
            return s.toUpperCase();
        }
        public static void main(String[] args){
            String q = "one";
            System.out.println(q);
            String qq = upcase(q);
            System.out.println(qq);
            System.out.println(q);
        }
    }

    运行结果

    2.重载+与StringBuilder

    String对象是不可变的,所以在字符串实现+的时候,编辑器创建了一个StringBuilder对象,用以构造最终的String,并且为每个字符串调用一次StringBuilder的append()方法。关于用+和StringBuilder的效率问题。

    package demo4;
    
    public class TestStringBuilder {
        public String f1(String[] fields){
            long startTime = System.currentTimeMillis();
            String result = "";
            for (int j = 0; j < 1000; j++) {
                for (int i = 0; i < fields.length; i++) {
                    result += fields[i];
                }
            }
            long endTime = System.currentTimeMillis();
            System.out.println("用时:" + (endTime - startTime) + "ms"); //输出程序运行时间
            return result;
        }
    
        public String f2(String[] fields){
            long startTime = System.currentTimeMillis();
            StringBuilder result = new StringBuilder();
            for (int j = 0; j < 1000; j++) {
                for (int i = 0; i < fields.length; i++) {
                    result.append(fields[i]);
                }
            }
            long endTime = System.currentTimeMillis();
            System.out.println("用时:" + (endTime - startTime) + "ms"); //输出程序运行时间
            return result.toString();
        }
    
        public static void main(String[] args){
            TestStringBuilder t1 = new TestStringBuilder();
            String[] a = {"aaa","bbbb","ccccc","ddddd","eeeeeeeeeeeee","ffffffffggggggufguyftydjytdrtsdtrstrsresffffffffffff"};
            t1.f1(a);
            t1.f2(a);
        }
    }

    运行结果

    结果显而易见,用StringBuilder的效率要比+的效率高出很多,究其原因就是每一次的+操作其实等于new StringBuilder,而程序在for循环中的运行的时候每次都会new 一个StringBuilder,而f2()方法只生成了一个StringBuilder对象,显式地创建StringBuilder还允许预先为其指定大小,如果已经知道最终的字符串大概有多长,那预先指定StringBuilder的大小可以避免多次重新分配缓冲。

    3.正则表达式

     检查一个String是否匹配一个正则

    package demo4;
    
    public class IntegerMatch {
        public static void main(String[] args){
            System.out.println("-1234".matches("-?\d+"));
            System.out.println("5678".matches("-?\d+"));
            System.out.println("+911".matches("-?\d+"));
            System.out.println("+911".matches("(-|\+)?\d+"));
        }
    }

    运行结果:

    String类还自带一个非常有用的正则表达式工具-split()方法,其功能是“将字符串从政策表达式匹配的地方切开”。

    package demo4;

    import java.util.Arrays;

    public class Splitting {
    public static String knight = "Then When you have found the shrubbery,you must cut down the mightiest three in the forest...with...a herring";
    public static void split(String regex){
    System.out.println(Arrays.toString(knight.split(regex)));
    }
    public static void main(String[] args){
    split(" ");
    split("\W+");
    }
    }

    运行结果

    第一句:用普通字符作为正则表达式,第一个只是按照空格划分字符串

    第二句:将标点字符删除了

    4.Pattern和Matcher

    package demo4;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class TestRegularExpression {
        public static void main(String[] args){
            String[] str = {"abcabcabcdefabc", "abc+", "(abc)+","(abc){2,}"};
            args = str;
            TestRegularExpression t = new TestRegularExpression();
            if (args.length<2){
                System.out.println("Usage:
    java TestRegularExpression characterSequence regularExpression+");
                System.exit(0);
            }
    
            System.out.println("Input:""+args[0]+""");
            for (String arg:args){
                System.out.println("Regular expression :""+arg+""");
                Pattern p = Pattern.compile(arg);
                Matcher m = p.matcher(args[0]);
                while (m.find()){
                    System.out.println("Match""+m.group()+""at positions"+m.start()+"-"+(m.end()-1));
                }
            }
        }
    }

    运行结果:

    Pattern对象表示编译后的正则表达式。使用一边以德Pattner对象上的matcher()方法,加上一个输入字符串,从而共同构造了一个Macther对象。

  • 相关阅读:
    Delphi单元文件之-防止程序重复执行
    cxGrid使用汇总2
    Delphi数组复制
    cxGrid使用汇总1
    Delphi XE5 android 获取网络状态
    xe5 android sample 中的 SimpleList 是怎样绑定的
    XE5 Android 开发数据访问手机端 解决乱码的办法
    设计模式之代理模式
    设计模式之单例模式及原型模式
    设计模式之工厂模式
  • 原文地址:https://www.cnblogs.com/xiayq/p/10507946.html
Copyright © 2011-2022 走看看