`
shukuiyan
  • 浏览: 413307 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于java中split的使用

阅读更多

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

String s2="this is a test";
String sarray[]=s2.split("/s");
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 不作为任何数组元素的部分返回。

一个例子

String srcstring="this is a about split test";
String stringarray[]=srcstring.split(" ");
//// 在每个空格字符处进行分解
for(String stemp:stringarray){
	System.out.println(stemp);
}
String srcstring1=" this  is a about split  test";//有n个空格的话,分成的数组长度为n+1
//如果字符串中有多个空格时,则两个空格间认为是没有字符,结果字符串数组中该位置为空。
String stringarray1[]=srcstring1.split(" ");
for(String stemp:stringarray1){
	System.out.println(stemp);
}

这样输出结果为

this
is
a
about
split
test

另一个:

this

is
a
about
split

test

另外一个例子

String srcstring="this is a about split test";
String stringarray[]=srcstring.split(" ",2);
//// 在每个空格字符处进行分解
for(String stemp:stringarray){
       System.out.println(stemp);
}
输出结果为
this
is a about split test

 看看下面这个

String ipstring="59.64.159.224";
String iparray[]=ipstring.split(".");
for(String stemp:iparray){
	System.out.println(stemp);
}
这个输出为空,为什么呢?

因为 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 的方法。我们知道,“ . ”在正则表达式中有特殊的含义,因此我们使用的时候必须进行转义。 只要将

String iparray[]=ipstring.split(".");

 

改为

String iparray[]=ipstring.split("\\.");


就可以了。

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

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


注意:public String[] split(String regex,int limit)根据匹配给定的正则表达式来拆分此字符串。
此方法返回的数组包含此字符串的每个子字符串,这些子字符串由另一个匹配给定的表达式的子字符串终止或由字符串结束来终止。数组中的子字符串按它们在此字符串中的顺序排列。如果表达式不匹配输入的任何部分,则结果数组只具有一个元素,即此字符串。

limit 参数控制模式应用的次数,因此影响结果数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后项将包含超出最后匹配的定界符的所有输入。如果 n 为非正,则模式将被应用尽可能多的次数,而且数组可以是任意长度。如果 n 为零,则模式将被应用尽可能多的次数,数组可有任何长度,并且结尾空字符串将被丢弃。

 

回到最初的题目,题目中给出的匹配正则表达式为"/s",表示空白字符,此时给定的字符串中没有匹配的字符,则输出为原字符串,所以输出的字符长度为1.

 

再附上一些关于java中正则表达式的知识吧

^ 为限制开头
^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>

在使用 Pattern.compile 函数时,可以加入控制正则表达式的匹配行为的参数:
Pattern Pattern.compile(String regex, int flag)

flag 的取值范围如下:
Pattern.CANON_EQ    
当且仅当两个字符的 " 正规分解 (canonical decomposition)" 都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式 "a\u030A" 会匹配 "?" 。默认情况下,不考虑 " 规范相等性 (canonical equivalence)"
Pattern.CASE_INSENSITIVE(?i)    
默认情况下,大小写不明感的匹配只适用于 US-ASCII 字符集。这个标志能让表达式忽略大小写进行匹配。要想对 Unicode 字符进行大小不明感的匹配,只要将 UNICODE_CASE 与这个标志合起来就行了。
Pattern.COMMENTS(?x)    
在这种模式下,匹配时会忽略 ( 正则表达式里的 ) 空格字符 ( 译者注:不是指表达式里的 "\\s" ,而是指表达式里的空格, tab ,回车之类 ) 。注释从 # 开始,一直到这行结束。可以通过嵌入式的标志来启用 Unix 行模式。

Pattern.DOTALL(?s)     在这种模式下,表达式 '.' 可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式 '.' 不匹配行的结束符。
Pattern.MULTILINE
(?m)    
在这种模式下, '^' '$' 分别匹配一行的开始和结束。此外, '^' 仍然匹配字符串的开始, '$' 也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。
Pattern.UNICODE_CASE
(?u)    
在这个模式下,如果你还启用了 CASE_INSENSITIVE 标志,那么它会对 Unicode 字符进行大小写不明感的匹配。默认情况下,大小写不敏感的匹配只适用于 US-ASCII 字符集。
Pattern.UNIX_LINES(?d)    
在这个模式下,只有 '\n' 才被认作一行的中止,并且与 '.' '^' ,以及 '$' 进行匹配。

 

抛开空泛的概念,下面写出几个简单的 Java 正则用例:

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

//
查找以 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, 正则表达式 Hello World");
//
替换第一个符合正则的数据
System.out.println(matcher.replaceFirst("Java"));

文字替换(全部)
Pattern pattern = Pattern.compile("
正则表达式 ");
Matcher matcher = pattern.matcher("
正则表达式 Hello World, 正则表达式 Hello World");
//
替换第一个符合正则的数据
System.out.println(matcher.replaceAll("Java"));


文字替换(置换字符)
Pattern pattern = Pattern.compile("
正则表达式 ");
Matcher matcher = pattern.matcher("
正则表达式 Hello World, 正则表达式 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);

查找 html 中对应条件字符串
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("\r\n");             
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

分享到:
评论
8 楼 wygdove 2014-12-11  
楼主好,有一个问题请教。
对于第二段示例代码,楼主说到“如果字符串中有多个空格时,则两个空格间认为是没有字符,结果字符串数组中该位置为空。 ”,那么如果我想统计一个字符串中的单词数,先以空格分割后遍历字符数组中不为空值计数。但是实际上是会重复计数的,请问这是为什么???
7 楼 u012076104 2014-05-22  
  顶
6 楼 shinestarwang 2013-09-22  
严重误导别人!,你是不知道什么是空白符呢还是写错了呢?你把/s输出来看一下,这个不是正则表达式,只是一个字符串,空白符的字符串是\s,在JAVA里写成以空白符分割时应许这样写:
str.split("\\s");
5 楼 iBoyce 2013-08-02  
Good
4 楼 cenyi2012 2013-03-22  
我差点也在这栽跟头了。。。
3 楼 Navee 2012-11-21  
一个split(".")让我弄了半天。
2 楼 xglsq2003 2012-10-22  
1楼说的对,楼主看走眼了
1 楼 argel_lj 2012-02-08  
"/s"表示空白字符吗,不是"\s"?

相关推荐

    Java中Split的用法及注意

    Java 中 Split 的用法及注意 Java 中的 Split 方法是通过正则表达式来拆分字符串的,它可以将一个字符串分割为子字符串,然后将结果作为字符串数组返回。该方法的语法为 `stringObj.split(regex, [limit])`,其中 `...

    JAVA_split_用法

    在Java编程语言中,`String`类提供了多个实用的方法来处理字符串,其中`split()`方法是用于将一个字符串分割成字符串数组的一种常见方式。此方法利用正则表达式(Regular Expression)作为分隔符来分割字符串,并...

    java中的split的用法

    ### Java中的split方法详解 #### 一、引言 在Java编程中,字符串处理是非常常见的需求之一。`String`类提供了多种方法来处理字符串,其中`split`方法因其灵活...希望本文能对你在实际开发中使用`split`方法提供帮助。

    Java字符串分隔方法split实践

    `split()`方法位于`java.lang.String`类中,它的基本语法如下: ```java public String[] split(String regex) ``` 这里的`regex`参数是一个正则表达式,用于定义分隔字符串的规则。正则表达式是一种强大的文本...

    C#中split的使用

    在C#编程语言中,`Split`方法是一个非常重要的字符串处理函数,用于将一个字符串分割成多个子字符串的数组。这个方法通常用于处理文本数据,例如解析由特定字符分隔的字符串。`Split`方法是`System.String`类的一个...

    java的String[] split 示例

    在Java编程语言中,`String`类提供了许多用于操作字符串的方法,其中之一便是`split`方法。这个方法在处理文本数据时极为有用,特别是在需要根据特定的分隔符将字符串分割成多个子串的情况下。下面,我们将深入探讨`...

    java split()使用方法解析

    Java split() 函数使用方法解析 Java split() 函数是 Java 编程语言中一个非常常用的字符串分割函数,它可以将一个字符串按照指定的分隔符分割成多个子字符串,并将其存储在一个字符串数组中。下面我们将详细介绍 ...

    Javasplit.java

    文件目录转json格式

    java_spliter.zip_java split_java spliter_分割文件

    `split`函数是Java中用于字符串分割的关键方法,它接受一个正则表达式作为参数,返回一个字符串数组,其中每个元素都是原字符串根据正则表达式分割后的结果。在这个文件分割程序中,`split`可能不是直接用于字符串...

    java的split方法使用示例

    Java中的`split()`方法是String类的一个非常重要的成员函数,它用于将字符串按照指定的分隔符进行切割,返回一个字符串数组。这个方法在处理文本数据时尤其有用,例如解析CSV格式的数据、处理用户输入或者从日志文件...

    浅析Java中Split函数的用法技巧

    Java中的`String.split()`方法是处理字符串的强大工具,它能够根据指定的分隔符将一个字符串分割成多个子字符串,并将这些子字符串存储在一个数组中。这个方法在处理文本数据时非常常见,尤其是在解析CSV格式的数据...

    Java字符串split使用方法代码实例

    Java字符串split使用方法代码实例是 Java 编程语言中的一种常见操作,用于将一个字符串拆分成多个子字符串。下面我们将详细介绍 Java 字符串 split 使用方法代码实例。 什么是字符串 Split 在 Java 中,字符串 ...

    Java的split方法使用详解

    这意味着如果你的分隔符在正则表达式中有特殊含义(例如`.`代表任意字符),你需要使用反斜杠`\`进行转义,如`split("\\.")`。 - 正则表达式支持更多的复杂匹配,比如使用`|`表示或操作,`^`表示行首,`$`表示行尾,...

    split this is a split java develop utils package

    在Java中,通常使用`String`类的`split()`方法来拆分字符串,但自定义的工具包可能会提供更高级的特性,如支持正则表达式、多维度分割、自定义分隔符或者性能优化等。 下面我们将深入探讨Java中字符串分割的相关...

    java中使用FFMpeg获取视频时长

    在Java中使用FFmpeg,开发者可以方便地集成到自己的应用中,实现对视频、音频的分析和操作。 在Java中使用FFmpeg获取视频时长,首先需要安装FFmpeg命令行工具,并将其添加到系统的PATH环境变量中,以便Java程序可以...

    java正则表达式匹配全角空格

    本文将详细介绍如何使用Java中的`split()`方法,并结合正则表达式来处理全角空格和半角空格的问题。 #### 一、背景介绍 在处理文本数据时,经常会遇到不同类型的空格字符。除了最常见的半角空格(ASCII码为32)...

    Android中Split()字符串分割特殊用法案例详解

    split()分割字符串 1.不同环境下的区分 Java:分割字符串不能写成split(“$”)//$为要分割的字符 Android:分割字符串需要加上中括号split(“[$]”)/...所以想要使用 | ,必须用 \ 来进行转义,而在java字符串中,\

    Java使用split截取字符串过程解析

    在Java编程语言中,`split()` 是一个非常实用的方法,用于根据给定的正则表达式将字符串分割成多个子字符串。这个方法存在于 `java.lang.String` 类中,它的主要功能是将一个字符串分解成一个字符串数组,其中每个...

    java split()方法实用案例

    java split()方法实用案例

Global site tag (gtag.js) - Google Analytics