------- android培训、java培训、期待与您交流! ----------------
正则表达式(掌握用法)
(1)符合一定规则的字符串。
(2)规则:
A:字符
x 字符 x
\\ 反斜线字符
\r 回车符
\n 换行符
B:字符类
[abc] a、b 或 c
[^abc] 任何字符,除了 a、b 或 c
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内
[0-9] 包括0-9之间的字符
C:预定义字符类
. 任何字符
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
就是指这里出现的不能使单词字符。
he;wor xixi
E:Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
F:组的概念(按照小括号从左开始编号,每一个对应着一个组)
(a(b(c)d(e)))
第一组:a(b(c)d(e))
第二组:b(c)d(e)
第三组:c
第四组:e
(3)通过String类的功能使用正则表达式
A:判断功能
public boolean matches(String regex)
B:分割功能
public String[] split(String regex)
C:替换功能
public String replaceAll(String regex,String newString)
记住:
叠次:
在同一个字符串中,右边引用左边:"(.)\\1+"
在后一个字符串中引用前面的字符串的组内容:"(.)\\1+","$1"
代码如下:
/*
* 一般的正则表达式
* 组的概念:
* 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。
在调用组时,使用\组的编号(如\1)来进行访问。
组的概念属于高级正则的内容。建议大家在大量实际正则案例的基础上去理解套用。
*/
public class Demo9 {
public static void main(String[] args) {
/*切割字符串"aa,bb,cc";
String regex = ",";
String[] split = "aa,bb,cc".split(regex);
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
*/
/*切割字符串"aa.bb.cc";
String regex2 = "\\.";
String[] split2 = "aa.bb.cc".split(regex2);
for (int i = 0; i < split2.length; i++) {
System.out.println(split2[i]);
}
System.out.println("====================");
*/
/*切割字符串"-1 99 4 23";
String regex3 = " ";
String[] split3 = "-1 99 4 23".split(regex3);
for (int i = 0; i < split3.length; i++) {
System.out.println(split3[i]);
}
System.out.println("====================");
*/
/*切割字符串"-1 99 4 23";
String regex4 = " +";
String[] split4 = "-1 99 4 23".split(regex4);
for (int i = 0; i < split4.length; i++) {
System.out.println(split4[i]);
}
System.out.println("====================");
*/
/*复杂的叠词切割: "sdqqfgkkkhjppppkl";
String regex5 = ("(.)\\1+");
String[] split5 = "sdqqfgkkkhjppppkl".split(regex5);
for (int i = 0; i < split5.length; i++) {
System.out.println(split5[i]);
}
System.out.println("====================");
*/
/*用”#”替换叠:"sdaaafghccccjkqqqqql";
String regex6 = ("(.)\\1+");
String newString = "sdaaafghccccjkqqqqql".replaceAll(regex6,"#");
System.out.println(newString);
System.out.println("====================");
*/
/*用”#”替换叠:"sdaaaf324cjkqqqq4q356l";
String regex7 = ("\\d");
String newString = "sdaaaf324cjkqqqq4q356l".replaceAll(regex7,"*");
System.out.println(newString);
System.out.println("====================");
*/
/*将这个字符创当中的叠词编程一个字符"sdaaafghccccjkqqqqql";>>>>"sdafghcjkql"*/
String regex8 = ("(.)\\1+");
String newString = "sdaaafghccccjkqqqqql".replaceAll(regex8,"$1");
System.out.println(newString);
System.out.println("====================");
}
}
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 正则表达式编译表示形式
* Pattern和Matcher
*
* 范例:
Pattern p = Pattern.compile("a*b"); //指定一个符合某规则的正则表达式编译表示形式
Matcher m = p.matcher("aaaaab"); //要匹配的字符串,光剑匹配器
boolean b = m.matches(); //要进行的操作:这里这句话进行的操作就是:将整个字符串进行这个公式的匹配
在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。
此方法编译表达式并在单个调用中将输入序列与其匹配。语句
boolean b = Pattern.matches("a*b", "aaaaab");
步骤:
1:先将正则表达式编译成对象,使用的是Pattern类中一个静态的方法.compile(regex);
2:让正则表达式和要操作的字符串相关联,通过matches方法完成,并返回匹配器对象.
3:通过匹配器对象的方法将正则表达式作用到字符串上对字符串进行针对性的功能操作.
*/
public class Demo10 {
public static void main(String[] args) {
//想要获取3个字母组成的单词
String str = "da jia zhu yi le, ming tian bu fang jia, xie xie!";
String reg = "\\b[a-z]{3}\\b";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
while(m.find())
{
//System.out.println(m.start()+"..."+m.end());
//System.out.println("sub:"+str.substring(m.start(),m.end()));
System.out.println(m.group());//必须与find()方法一起使用
}
}
}
-