加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

split()&正则

发布时间:2020-12-14 01:23:37 所属栏目:百科 来源:网络整理
导读:之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题,但是最近一次笔试中居然有碰到了这个知识点,而且还做错了,囧!学艺不精

之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题,但是最近一次笔试中居然有碰到了这个知识点,而且还做错了,囧!学艺不精啊。题目大概是这样的:

Java代码
  1. Strings2="thisisatest";
  2. Stringsarray[]=s2.split("/s");
  3. System.out.println("sarray.length="+sarray.length);

这个输出是什么还是编译出错?我想那个split方法中的参数要是"s"的话,输出一定是4了,就是将原来字符串分成了数组{"thi","i","a te","t"},但是原题split方法中的参数要是"/s",那么这个参数到底是嘛意思呢,实验后输出结果居然是1。

原因还得深究啊。

java.lang.string.split,即split 方法,它实现的功能是将一个字符串分割为子字符串,然后将结果作为字符串数组返回。 格式为:

stringObj.split([separator,[limit]])
其中stringObj是必选项,表示要被分解的 String 对象或文字。该对象不会被 split 方法修改。 separator 为可选项,表示字符串或正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。 limit 为可选项,该值用来限制返回数组中的元素个数。 值得注意的是: split 方法的结果是一个字符串数组,在 stingObj 中每个出现 separator 的位置都要进行分解,separator 不作为任何数组元素的部分返回。

一个例子

  • Stringsrcstring="thisisaaboutsplittest";
  • Stringstringarray[]=srcstring.split("");
  • ////在每个空格字符处进行分解
  • for(Stringstemp:stringarray){
  • System.out.println(stemp);
  • }
  • Stringsrcstring1="thisisaaboutsplittest";//有n个空格的话,分成的数组长度为n+1
  • //如果字符串中有多个空格时,则两个空格间认为是没有字符,结果字符串数组中该位置为空。
  • Stringstringarray1[]=srcstring1.split("");
  • for(Stringstemp:stringarray1){
  • }
  • 这样输出结果为

    this
  • is
  • a
  • about
  • split
  • test
  • 另一个:
  • test
  • 另外一个例子

    Stringsrcstring="thisisaaboutsplittest";
  • Stringstringarray[]=srcstring.split("",2);
  • ////在每个空格字符处进行分解
  • for(Stringstemp:stringarray){
  • System.out.println(stemp);
  • }
  • 输出结果为
  • isaaboutsplittest
  • 看看下面这个

    Stringipstring="59.64.159.224";
  • Stringiparray[]=ipstring.split(".");
  • for(Stringstemp:iparray){
  • 这个输出为空,为什么呢?
  • 因为 public string[] split(string regex) 这里的参数的名称是regex ,也就是 regular expression (正则表达式)。这个参数并不是一个简单的分割用的字符,而是一个正则表达式,以下是split 方法的实现代码:
    public string[] split(string regex,int limit) {
    return pattern.compile(regex).split(this,limit);
    }

    split 的实现直接调用的 matcher 类的 split 的方法。我们知道,“ . ”在正则表达式中有特殊的含义,因此我们使用的时候必须进行转义。 只要将

    Stringiparray[]=ipstring.split(".");

    改为

    Stringiparray[]=ipstring.split(".");


    就可以了。

    那么这里在列上一些转义字符

    反斜杠
    t间隔('u0009')
    n换行('u000A')
    r回车('u000D')
    d数字等价于[0-9]
    D非数字等价于[^0-9]
    s空白符号[tnx0Bfr]
    S非空白符号[^tnx0Bfr]
    w单独字符[a-zA-Z_0-9]
    W非单独字符[^a-zA-Z_0-9]
    f换页符
    e Escape
    b一个单词的边界
    B一个非单词的边界
    G前一个匹配的结束

    为限制开头
    ^java 条件限制为以Java为开头字符
    $为限制结尾
    java$ 条件限制为以java为结尾字符
    .条件限制除n以外任意一个单独字符
    java.. 条件限制为java后除换行外任意两个字符

    加入特定限制条件「[]」
    [a-z] 条件限制在小写a to z范围中一个字符
    [A-Z] 条件限制在大写A to Z范围中一个字符
    [a-zA-Z]条件限制在小写a to z或大写A to Z范围中一个字符
    [0-9] 条件限制在小写0 to 9范围中一个字符
    [0-9a-z]条件限制在小写0 to 9或a to z范围中一个字符
    [0-9[a-z]]条件限制在小写0 to 9或a to z范围中一个字符(交集)

    []中加入^后加再次限制条件「[^]」
    [^a-z] 条件限制在非小写a to z范围中一个字符
    [^A-Z] 条件限制在非大写A to Z范围中一个字符
    [^a-zA-Z]条件限制在非小写a to z或大写A to Z范围中一个字符
    [^0-9] 条件限制在非小写0 to 9范围中一个字符
    [^0-9a-z]条件限制在非小写0 to 9或a to z范围中一个字符
    [^0-9[a-z]]条件限制在非小写0 to 9或a to z范围中一个字符(交集)

    在限制条件为特定字符出现0次以上时,可以使用「*」
    J* 0个以上J
    .* 0个以上任意字符
    J.*D J与D之间0个以上任意字符

    在限制条件为特定字符出现1次以上时,可以使用「+」
    J+ 1个以上J
    .+ 1个以上任意字符
    J.+D J与D之间1个以上任意字符

    在限制条件为特定字符出现有0或1次以上时,可以使用「?」
    JA? J或者JA出现

    限制为连续出现指定次数字符「{a}」
    J{2} JJ
    J{3} JJJ
    文字a个以上,并且「{a,}」
    J{3,} JJJ,JJJJ,JJJJJ,???(3次以上J并存)
    文字个以上,b个以下「{a,b}」
    J{3,5} JJJ或JJJJ或JJJJJ
    两者取一「|」
    J|A J或A
    Java|Hello Java或Hello

    「()」中规定一个组合类型
    比如,我查询<a href="index.html">index</a>中<a href></a>间的数据,可写作<a.*href=".*">(.+?)</a>


    比如,在字符串包含验证时

    //
    查找以Java开头,任意结尾的字符串
    Pattern pattern = Pattern.compile("^Java.*");
    Matcher matcher = pattern.matcher("Java
    不是人");
    boolean b= matcher.matches();
    //
    当条件满足时,将返回true,否则返回false
    System.out.println(b);

    以多条件分割字符串时
    Pattern pattern = Pattern.compile("[,|]+");
    String[] strs = pattern.split("Java Hello World Java,Hello,World|Sun");
    for (int i=0;i<strs.length;i++) {
    System.out.println(strs[i]);
    }

    文字替换(首次出现字符)
    Pattern pattern = Pattern.compile("
    正则表达式");
    Matcher matcher = pattern.matcher("
    Hello World,sans-serif; font-size:14px; line-height:25.1875px">Hello World");
    //
    替换第一个符合正则的数据
    System.out.println(matcher.replaceFirst("Java"));

    文字替换(全部)
    System.out.println(matcher.replaceAll("Java"));


    文字替换(置换字符)Hello World ");
    StringBuffer sbr = new StringBuffer();
    while (matcher.find()) {
    matcher.appendReplacement(sbr,"Java");
    }
    matcher.appendTail(sbr);
    System.out.println(sbr.toString());

    验证是否为邮箱地址

    String str="ceponline@yahoo.com.cn";
    Pattern pattern = Pattern.compile("[w.-]+@([w-]+.)+[w-]+",Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(str);
    System.out.println(matcher.matches());

    去除html标记
    Pattern pattern = Pattern.compile("<.+?>",Pattern.DOTALL);
    Matcher matcher = pattern.matcher("<a href="index.html">
    主页</a>");
    String string = matcher.replaceAll("");
    System.out.println(string);

    查找中对应条件字符串
    Pattern pattern = Pattern.compile("href="(.+?)"");
    Matcher matcher = pattern.matcher("<a href="index.html">
    </a>");
    if(matcher.find())
    System.out.println(matcher.group(1));
    }

    截取http://地址
    //
    url
    Pattern pattern = Pattern.compile("(http://|https://){1}[w.-/:]+");
    Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");
    StringBuffer buffer = new StringBuffer();
    while(matcher.find()){
    buffer.append(matcher.group());
    buffer.append("rn");
    System.out.println(buffer.toString());
    }

    替换指定{}中文字

    String str = "Java
    目前的发展史是由{0}-{1}";
    String[][] object={new String[]{"{0}","1995"},new String[]{"{1}","2007"}};
    System.out.println(replace(str,object));

    public static String replace(final String sourceString,Object[] object) {
    String temp=sourceString;
    for(int i=0;i<object.length;i++){
    String[] result=(String[])object[i];
    Pattern pattern = Pattern.compile(result[0]);
    Matcher matcher = pattern.matcher(temp);
    temp=matcher.replaceAll(result[1]);
    }
    return temp;
    }


    以正则条件查询指定目录下文件用于缓存文件列表
    private ArrayList files = new ArrayList();
    //
    用于承载文件路径
    private String _path;
    //
    用于承载未合并的正则公式
    private String _regexp;

    class MyFileFilter implements FileFilter {

    /**
    *
    匹配文件名称
    */
    public boolean accept(File file) {
    try {
    Pattern pattern = Pattern.compile(_regexp);
    Matcher match = pattern.matcher(file.getName());
    return match.matches();
    } catch (Exception e) {
    return true;
    }
    }
    }

    /**
    *
    解析输入流 * @param inpu

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读