------- android培训、java培训、期待与您交流! ----------
一、引入正则表达式
字符 字符类
X 字符X [abc] a,b或c(简单类)
\\ 反斜线字符 [^abc] 除了a,b,c的任何字符
\0n 八进制的字符n [a-zA-Z] a到z,或A到Z(范围)
\t 制表符 [a-d[m-p]] 含义与[a-dm-p]相同(并集)
\n 换行符 [a-z&&[def]] 结果与[def]相同但表现不同(交集)
\r 回车符 [a-z&&[^def]] a-z中除去def的字符(交集) \f 换页符 [a-z&&[^a-d]] 在a-z中除去a-d的字符(交集)
\a 报警 预定义字符类
. 任意字符(与行结束符可能匹配也可能不匹配)
\d 数字类:[0-9] \D 非数字类:[^0-9]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
\s 空白字符[\t\n\r\f\x0B]
\S 非空白字符 [^\s] 边界匹配器
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好n次
X{n,} X,至少n次
X{n,m} X,至少n次,但不超过m次
组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组: 1 ((A)(B(C))) 2 \A 3 (B(C)) 4 (C) 组零始终代表整个表达式。
更多详细信息,可查阅JDK文档中java.util.regex 中Pattern类的描述。2、需求:对邮件地址进行校验。public static void checkQQ(String qq)//使用时传入QQ号码进行校验 { String regex = "[1-9]\\d{4,14}"; boolean flag = qq.matches(regex); if(flag) System.out.println(qq+"...is ok"); else System.out.println(qq+"... 不合法"); }
public static boolean checkMail(String mail) { String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。 reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。 return mail.matches(reg); }
String[] | split(String regex) 根据给定正则表达式的匹配拆分此字符串。 |
String[] | split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。 |
五、替换public String[] getNames(String str){
//假如有这样一个字符串
str = "zhangsan lisi wangwu zhaoliu";
regex = " +";//规则是一个或多个空格
String[] names = str.split();
return names;
}
String | replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
String | replace(CharSequence target, CharSequence replacement) 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。 |
String | replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
String | replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 |
六、获取class RegexDemo { public static void main(String[] args) { String str = "wer1389980000ty1234564uiod234345675f";//将字符串中的数组替换成#。 replaceAllDemo(str,"\\d{5,}","#"); String str1 = "erkktyqqquizzzzzo";//将叠词替换成$.将重叠的字符替换成单个字母。zzzz->z replaceAllDemo(str1,"(.)\\1+","$1");////获取组,"$1"表示前面正则表达式中第一组中的内容
} public static void replaceAllDemo(String str,String reg,String newStr) { str = str.replaceAll(reg,newStr); System.out.println(str); }
}
典型的调用顺序:①构造一个模式.Pattern p = Pattern.compile("[a-z]*");②建造一个匹配器Matcher m = p.matcher(str);③进行判断,得到结果boolean b = m.matches();在仅使用一次正则表达式时,可以方便地通过此Pattern类的matcher()方法此方法编译表达式并在单个调用中将输入序列与其匹配。语句boolean b = Pattern.matches("[a-z]*", "aaaaab");
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
此类的实例是不可变的,可供多个并发线程安全使用。Matcher类的实例用于此目的则不安全。
static boolean | matches(String regex, CharSequence input) 编译给定正则表达式并尝试将给定输入与其匹配。 |
int | end() 返回最后匹配字符之后的偏移量。 |
int | end(int group) 返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。 |
boolean | find() 尝试查找与该模式匹配的输入序列的下一个子序列。 |
boolean | find(int start) 重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。 |
String | group() 返回由以前匹配操作所匹配的输入子序列。 |
String | group(int group) 返回在以前匹配操作期间由给 |
七、如何选择/* 获取:将字符串中的符合规则的子串取出。 操作步骤: 1,将正则表达式封装成对象。 2,让正则对象和要操作的字符串相关联。 3,关联后,获取正则匹配引擎。 4,通过引擎对符合规则的子串进行操作,比如取出。 */ import java.util.regex.*; class RegexDemo2 { public static void main(String[] args) { String str = "ming tian jiu yao fang jia le ,da jia。"; String reg = "\\b[a-z]{4}\\b";// \b 是单词边界 //将规则封装成对象。 Pattern p = Pattern.compile(reg); //让正则对象和要作用的字符串相关联。获取匹配器对象。 Matcher m = p.matcher(str); //System.out.println(m.matches());其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。 //只不过被String的方法封装后,用起来较为简单。但是功能却单一。 // boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。 // System.out.println(b); // System.out.println(m.group());//用于获取匹配后结果。 //System.out.println("matches:"+m.matches()); while(m.find())//与迭代器类似 { System.out.println(m.group()); System.out.println(m.start()+"...."+m.end()); } } }
- 如果只是想知道字符串是否符合某一规则,如用户名,QQ号码,电子邮件格式的校验。此时用匹配
- 若想把某一字符串转换成另一字符串,则用替换
- 想把一个字符串变成字符串数组,则用切割,获取规则以外的子串。
- 想要得到符合规则的字符串子串,用获取。用于获取符合规则的子串。
需求二:public static void test_1() { String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程"; /* 将已有字符串变成另一个字符串。使用替换功能。 1,可以先将 . 去掉。 2,在将多个重复的内容变成单个内容。 */ str = str.replaceAll("\\.+",""); System.out.println(str); str = str.replaceAll("(.)\\1+","$1"); System.out.println(str); }
八、网页爬虫public static void ipSort() { String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30"; ip = ip.replaceAll("(\\d+)","00$1"); System.out.println(ip); ip = ip.replaceAll("0*(\\d{3})","$1"); System.out.println(ip); String[] arr = ip.split(" "); TreeSet<String> ts = new TreeSet<String>(); for(String s : arr) { ts.add(s); } for(String s : ts) { System.out.println(s.replaceAll("0*(\\d+)","$1")); } }
public static void getMails_1()throws Exception { URL url = new URL("http://192.168.1.254:8080/myweb/mail.html"); URLConnection conn = url.openConnection(); BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; String mailreg = "\\w+@\\w+(\\.[a-zA-Z0-9]+)+"; Pattern p = Pattern.compile(mailreg); while((line=bufIn.readLine())!=null) { Matcher m = p.matcher(line); while(m.find()) { System.out.println(m.group()); } } }