java中split正则表达式详解
本来对正则表达式就不是很了解,结果要做个四则计算器,必须⽤到了,这⾥就补充下,内容均来⾃⽹络,若有侵犯,请联系本⼈!
Java代码
1. String s2="this is a test";
2. String sarray[]=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 不作为任何数组元素的部分返回。
⼀个例⼦
Java代码
1. String srcstring="this is a about split test";
2. String stringarray[]=srcstring.split(" ");
3.  在每个空格字符处进⾏分解
4. for(String stemp:stringarray){
java replace方法5.    System.out.println(stemp);
6. }
7. String srcstring1=" this  is a about split  test";//有n个空格的话,分成的数组长度为n+1
8. //如果字符串中有多个空格时,则两个空格间认为是没有字符,结果字符串数组中该位置为空。
9. String stringarray1[]=srcstring1.split(" ");
10. for(String stemp:stringarray1){
11.    System.out.println(stemp);
12. }
这样输出结果为
Java代码
1. this
2. is
3. a
4. about
5. split
6. test
7.
8. 另⼀个:
9.
10. this
11.
12. is
13. a
14. about
15. split
16.
17. test
另外⼀个例⼦
Java代码
1. String srcstring="this is a about split test";
2. String stringarray[]=srcstring.split(" ",2);
3.  在每个空格字符处进⾏分解
4. for(String stemp:stringarray){
5.        System.out.println(stemp);
6. }
7. 输出结果为
8. this
9. is a about split test
看看下⾯这个
Java代码
1. String ipstring="59.64.159.224";
2. String iparray[]=ipstring.split(".");
3. for(String stemp:iparray){
4.    System.out.println(stemp);
5. }
6. 这个输出为空,为什么呢?
因为 public string[] split(string regex) 这⾥的参数的名称是regex ,也就是 regular expression (正则表达式)。这个参数并不是⼀个简单的分割⽤的字符,⽽是⼀个正则表达式,以下是split ⽅法的实现代码:
public string[] split(string regex, int limit) {
return patternpile(regex).split(this, limit);
}
split 的实现直接调⽤的 matcher 类的 split 的⽅法。我们知道,“ . ”在正则表达式中有特殊的含义,因此我们使⽤的时候必须进⾏转义。 只要将
Java代码
1. String iparray[]=ipstring.split(".");
改为
Java代码
1. 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>
在使⽤ Patternpile 函数时,可以加⼊控制正则表达式的匹配⾏为的参数:
Pattern Patternpile(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 = Patternpile("^Java.*");
Matcher matcher = pattern.matcher("Java 不是⼈ ");
boolean b= matcher.matches();
// 当条件满⾜时,将返回 true ,否则返回 false
System.out.println(b);
◆ 以多条件分割字符串时
Pattern pattern = Patternpile("[, |]+");
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 = Patternpile(" 正则表达式 ");
Matcher matcher = pattern.matcher(" 正则表达式 Hello World, 正则表达式 Hello World");
// 替换第⼀个符合正则的数据
System.out.placeFirst("Java"));
◆ ⽂字替换(全部)
Pattern pattern = Patternpile(" 正则表达式 ");
Matcher matcher = pattern.matcher(" 正则表达式 Hello World, 正则表达式 Hello World");
// 替换第⼀个符合正则的数据
System.out.placeAll("Java"));
◆ ⽂字替换(置换字符)
Pattern pattern = Patternpile(" 正则表达式 ");
Matcher matcher = pattern.matcher(" 正则表达式 Hello World, 正则表达式 Hello World ");
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sbr, "Java");

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。