正则表达式
2015-11-09 10:27
495 查看
正则表达式总用:正确表示表示某一类字符串的规则 * 注意事项:
* a.当需要传递给正则表达式一个反斜线时,要用两个反斜线表示,因为字符串会消耗掉一个。
* b.在方括号前面的“^”是表示方括号中所有内容都排除出去。
* 总结:常用的正则表达式的字符类有以下几种。他的常用功能有匹配、切割、替换、获取。
*
* 字符:
*
* x 字符x
\\ 反斜线字符
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
\e 转义符 ('\u001B')
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
String中分割方法:
String通过正则表达式验证qq号码
在String中通过正则表达式替换字符串中字符
通过Pattern类和Matcher类获取字符串中满足要求的字符串
/*
* 在某个字符串中获取子字符串。
*/
class TestPattern{
public static void main(String[] args) {
//要进行查找的源字符串
String str = "我的手机是18511866260,我曾用过18987654321,还用过18812345678";
//要查找的字符串的正则表达式
String regex = "\\w{11}";
//获得要查找的内容
String[] arr = findString(str, regex);
//显示查找的内容
for(String s : arr){
System.out.println(s);
}
}
public static String[] findString(String source, String regex){
//得到Pattern对象
Pattern p = Pattern.compile(regex);
//接受需要的字符串数组
List<String> result = new ArrayList<>();
//得到Matcher对象
Matcher m = p.matcher(source);
for(int i = 0; m.find(); i++){
result.add(m.group());
}
return result.toArray(new String[0]);
}
}
* a.当需要传递给正则表达式一个反斜线时,要用两个反斜线表示,因为字符串会消耗掉一个。
* b.在方括号前面的“^”是表示方括号中所有内容都排除出去。
* 总结:常用的正则表达式的字符类有以下几种。他的常用功能有匹配、切割、替换、获取。
*
* 字符:
*
* x 字符x
\\ 反斜线字符
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
\e 转义符 ('\u001B')
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
String中分割方法:
class Split{ //定义需要分割的字符串 public static String str = "从明天起,做一个幸福的人\r\n" + "喂马,劈柴,周游世界\r\n" + "从明天起,关心粮食和蔬菜\r\n" + "我有一所房子,面朝大海,春暖花开\r\n" + "从明天起,和每一个亲人通信\r\n" + "告诉他们我的幸福\r\n" + "那幸福的闪电告诉我的\r\n" + "我将告诉每一个人\r\n" + "给每一条河每一座山取一个温暖的名字\r\n" + "陌生人,我也为你祝福\r\n" + "愿你有一个灿烂的前程\r\n" + "愿你有情人终成眷属\r\n" + "愿你在尘世获得幸福\r\n" + "我只愿面朝大海,春暖花开"; public static void main(String[] args) { //定义只将句子分割成单个字符的正则表达式 String regex = "\\r\\n"; //将句子按照正则表达式分割 String[] arr = str.split(regex); //显示分割后的字符数组 for(String s : arr){ System.out.println(s); } } }
String通过正则表达式验证qq号码
/* * 使用非正则表达式验证QQ号码。 * 需求:校验qq号码. * 1:要求必须是5-15位数字 * 2:0不能开头 * 3:必须都是数字 * * 分析:可以将1分解为QQ号码必须是5-15位字符和所有字符都是数字。 * 刚好和第三个要求重复。所以验证分为三个&&关系的条件验证,所以使用嵌套的if-else */ class CheckNum{ public static void main(String[] args) { //查看能否验证出qq长度 String qq1 = "1234"; System.out.println(qq1 + "是否满足要求:" + checkQQWithoutRegex(qq1)); //查看是否能验证出qq号以零开头 String qq2 = "0123456"; System.out.println(qq2 + "是否满足要求:" + checkQQWithoutRegex(qq2)); //查看能否验证出qq号都是数字 String qq3 = "12345abc87"; System.out.println(qq1 + "是否满足要求:" + checkQQWithoutRegex(qq1)); //查看是否能验证正确的qq号 String qq4 = "12345678"; System.out.println(qq3 + "是否满足要求:" + checkQQWithoutRegex(qq4)); } /* * 验证QQ号 * 不使用正则表达式。 * @param qq 要验证的qq号 * @return 验证的qq号是否满足要求的boolean值 */ public static boolean checkQQWithoutRegex(String qq){ //验证QQ号长度是否在5-15 if(qq.length() >= 5 && qq.length() <= 15){ //验证qq号是否已零开始 if(!qq.startsWith("0")){ //将qq号分割 char[] arr = qq.toCharArray(); //验证QQ号是否都是数字 for(char c : arr){ if(c > '9' || c < '0'){ return false; } } } else { return false; } } else { return false; } //经过上面三层验证,满足要求 return true; } /** * 使用正则表达式验证qq号 * @param qq 要验证的qq号 * @return 验证的qq号是否满足要求的boolean值 */ public static boolean checkQQWithRegex(String qq){ //将对qq号的要求转换成正则表达式 //[1-9]表示开头不能是零,只能是剩下的9个数字 //"\\d"表示所有十进制基数。两个反斜线是因为字符串需要对反斜线进行反义。 String regex = "[1-9]\\d{5, 14}"; //使用String的matches(String regex)验证 boolean result = qq.matches(regex); return result; } }
在String中通过正则表达式替换字符串中字符
class ReplaceAll{ public static void main(String[] args) { //定义单词和数字混合的句子 String str = "八月234逝去\r23\n山峦32清晰\r32\n河水平23423滑起伏"; //确定将要查找的字符的正则表达式 String regex = "\\d"; //需要替换成的句子成分 String newString = ""; //将句子中数字清除。可以使用String的 //replaceAll(String regex, String newString)方法使用空字符串替换句子中数字 str = adjust(str, regex, newString); //输出整理好的句子 System.out.println("调整好的句子:\r\n" + str); } /** * 调整句子中成分 * @param str 源句子 * @param regex 需要替换成分的正则表达式 * @return */ public static String adjust(String str, String regex, String newString) { return str.replaceAll(regex, newString); } }
通过Pattern类和Matcher类获取字符串中满足要求的字符串
/*
* 在某个字符串中获取子字符串。
*/
class TestPattern{
public static void main(String[] args) {
//要进行查找的源字符串
String str = "我的手机是18511866260,我曾用过18987654321,还用过18812345678";
//要查找的字符串的正则表达式
String regex = "\\w{11}";
//获得要查找的内容
String[] arr = findString(str, regex);
//显示查找的内容
for(String s : arr){
System.out.println(s);
}
}
public static String[] findString(String source, String regex){
//得到Pattern对象
Pattern p = Pattern.compile(regex);
//接受需要的字符串数组
List<String> result = new ArrayList<>();
//得到Matcher对象
Matcher m = p.matcher(source);
for(int i = 0; m.find(); i++){
result.add(m.group());
}
return result.toArray(new String[0]);
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- msql 正则表达式
- 正则表达式
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序