正则:正,乃合于法则也;则,规则也。正则,正规,常规是也。
元字符:
Java中正则表达式含有一些具有特殊意义字符的字符串,这些字符成为正则表达式的元字符。
例如:\\dcat中的\\d就是有特殊意义的元字符,代表了0~9中的任意一个数字。
下表列出了部分常用元字符及其意义:
元字符 | 在正则表达式中的写法 | 意义 |
. | . | 代表任何一个字符 |
\d | \\d | 代表0~9任意一个数字 |
\D | \\D | 代表任何一个非数字字符 |
\s | \\s | 代表空格类字符,'\t','\n‘,'\x0B','\f','\r' |
\S | \\S | 代表非空格类字符 |
\w | \\w | 代表可用于标识符的字符(不包括美元符号) |
\W | \\W | 代表不能用于标识符的字符 |
正则表达式中:“[ ]”括起若干字符=>表示一个元字符,该元字符代表“[ ]”中的任何一个字符。
例如:regex = “[159]ABC”;表示"1ABC”、"5ABC”、"9ABC”都是和正则表达式regex匹配的字符串。
限定修饰符:
常用限定修饰符用法如下表:
带限定修饰符的模式 | 意义 |
X? | X出现0次或1次 |
X* | X出现0次或多次 |
X+ | X出现1次或多次 |
X{n} | X恰好出现n次 |
X{n,} | X至少出现n次 |
X{n,m} | X出现n次至m次 |
XY | X的后缀是Y |
X|Y | X或Y |
以下代码是判断给定字符串是否全由英文字母所组成:
package sj.RegularExpression_v01; /** * 判断给定字符串是否全由英文字母组成 * @author Songjie_xuan * */ public class Judge_Letter { public static void main(String[] args) { String str1 = "afadfhadfjoadsjfad"; String str2 = "afadsfasdf;adfasd ;"; // 定义正则表达式 String regex = "[a-zA-Z]+"; test(str1,regex); test(str2,regex); } private static void test(String str, String regex) { if(str.matches(regex)) { System.out.println(str+"都是由英文字符组成的"); } else System.out.println(str+"不都是由英文字符组成的"); } }
测试结果如下:
到此,大致上了解了正则表达式,那么正则表达式到底有什么用呢?下面就做一些简单的介绍:
1.字符串的替换:
Java中可以利用正则表达式将给定字符串中的指定字符或字符串替换成另外的字符或字符串。具体做法是用字符串对象调用public String replaceAll(String regex,String replacement)方法返回一个字符串,该方法中replacement表示替换后的字符串。实际应用如下:
package sj.RegularExpression; /** * 替换 * * @author Songjie_xuan * @time 2014-10-13 */ public class Replace_Demo { public static void main(String[] args) { // String str = "我...要...要..吃..吃...饭!"; System.out.println("替换前:\n" + str); String regex_Str = "\\.+"; String new_Str = ""; str = replace_Meth(str, regex_Str, new_Str); regex_Str = "(.)\\1+"; new_Str = "$1"; replace_Meth(str, regex_Str, new_Str); } /** * 替换 * * @param all_Str * =>所有字符串 * @param regex_Str * =>被替换的字符串 * @param str * =>指定替换成该字符串 */ public static String replace_Meth(String all_Str, String regex_Str, String str) { // str调用replaceAll(regex_Str, str)方法进行替换 String new_Str = all_Str.replaceAll(regex_Str, str); // 输出替换后的字符串 System.out.println("替换后:\n" + new_Str); return new_Str; } }
测试结果如图:
2.字符串的分割
正则表达式还可以将字符串按照给定的分隔字符分割字符串。具体做法是字符串调用public String[] split(String regex)方法,参数regex是分割字符串的分隔符。实际应用如下:
package sj.RegularExpression; /** * 分隔 * * @author Songjie_xuan * @time 2014-10-13 */ public class Split_Demo { public static void main(String[] args) { // **一般分隔式切割** // String str = "七夜,杨亦风,魔雨,魔雷,魔电"; // String regex_Str = ","; // out_Split(str, regex_Str); // **点分隔式切割** // String str = "七 夜.杨亦风.魔 雨.魔 雷.魔 电"; // String regex_Str = "\\."; // out_Split(str, regex_Str); // **"\"式切割 String str = "F:\\冷锋SJ记忆\\冷锋\\资料\\学习资料\\编程语言\\Java"; String regex_Str = "\\\\"; out_Split(str, regex_Str); // **多空格分隔式切割** // String str = "七夜 杨亦风 魔 雨 魔雷 魔电"; // String regex_Str = " +"; // out_Split(str, regex_Str); // **叠词切割** // String str = "cfgaaaabbcdfajdfkddaaaaff"; // String regex_Str = "aa+"; // out_Split(str, regex_Str); // **表达式重用** // 分组:使用()对正则表达式分组,每个分组有一个编号 // "(.)\\第几组"引用该组 // String str = "cfgaacbbdfajddfaakaaaafhf"; // String regex_Str = "(.)\\1+"; // out_Split(str, regex_Str); } public static void out_Split(String str, String regex) { System.out.println(str); String[] str_Arr = str.split(regex); // 加强遍历 for (String test_Str : str_Arr) { System.out.println(test_Str); } } }
3.字符串的提取
正则表达式还可以从字符串中提取指定的字符或字符串。实际应用如下:
package sj.RegularExpression; import java.util.regex.*; /** * 获取 * * @author Songjie_xuan * @time 201-10-13 */ public class Get_Demo { public static void main(String[] args) { String _Str = "is equivalent to the three statements above abc cds afd adf"; // **获取给定字符串中的所有单词** // 定义正则表达式re_Str // 代表从给定的字符串中获取由3个字母组成的单词 String re_Str = "\\b[a-zA-Z]{3}\\b"; // 将正则表达式编译成Pattern对象 Pattern p = Pattern.compile(re_Str); // 将要处理的字符串和正则表达式关联起来,得到一个匹配器对象 Matcher m = p.matcher(_Str); // 调用find()方法进行匹配 while (m.find()) { String s = m.group(); System.out.println(s); } } }
测试结果如下: