正则表达式
一、字符解释
1、^为限制开头
^java :条件限制为 java 为开头的字符。
2、$为限制结尾
java$ :条件限制为以 java 为结尾符。
3、 \
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
4、?
匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
5、*
匹配前面的子表达式零次或多次(大于等于0次)。例如,zo*能匹配“z”,“zo”以及“zoo”。*等价于{0,}。
6、+
匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
7、{n}
n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
8、点.
匹配除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式。
9、x|y
匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
10、[^abc]
负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
11、[a-z]
字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
12、\b
能匹配一个单词的边界,例如 er\b 能匹配到nerver的er ,但不能匹配“verb”中的“er”。13、\B
匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
14、\d
匹配一个数字字符,相当于[0-9]
15、\D
匹配一个非数字字符,相当于[^0-9]
16、\w
匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
17、\W
匹配任何非单词字符。等价于“[^A-Za-z0-9_]
18、|
将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:这个元字符不是所有的软件都支持的。
19、\( \)
将 \( 和 \) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
20、\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
21、\S
22、\f
匹配一个换页符。
23、\n
匹配一个换行符
24、\r
匹配一个回车符
◆ 比如,在字符串包含验证时
// 查找以 Java 开头 , 任意结尾的字符串
Pattern pattern = Pattern.compile("^Java.*");
Matcher matcher = pattern.matcher("Java 不是人 ");
boolean b= matcher.matches();
// 当条件满足时,将返回 true ,否则返回 false
System.out.println(b);
◆ 以多条件分割字符串时
Pattern pattern = Pattern.compile("[, |]+");
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 = Pattern.compile(" 正则表达式 ");
Matcher matcher = pattern.matcher(" 正则表达式 Hello World, 正则表达式 Hello World");
// 替换第一个符合正则的数据
System.out.println(matcher.replaceFirst("Java"));
◆ 文字替换(全部)
Pattern pattern = Pattern.compile(" 正则表达式 ");
Matcher matcher = pattern.matcher(" 正则表达式 Hello World, 正则表达式 Hello World");
// 替换第一个符合正则的数据
System.out.println(matcher.replaceAll("Java"));
◆ 文字替换(置换字符)
Pattern pattern = Pattern.compile(" 正则表达式 ");
Matcher matcher = pattern.matcher(" 正则表达式 Hello World, 正则表达式 Hello World ");
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sbr, "Java");
}
matcher.appendTail(sbr);
System.out.println(sbr.toString());
◆ 验证是否为邮箱地址
String str="ceponline@yahoo.com.cn";
Pattern pattern = Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());
◆ 去除 html 标记
Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);
Matcher matcher = pattern.matcher("<a href=\"index.html\"> 主页 </a>");
String string = matcher.replaceAll("");
System.out.println(string);
◆ 查找 html 中对应条件字符串
Pattern pattern = Pattern.compile("href=\"(.+?)\"");
Matcher matcher = pattern.matcher("<a href=\"index.html\"> 主页 </a>");
if(matcher.find())
System.out.println(matcher.group(1));
}
◆ 截取 http:// 地址
// 截取 url
Pattern pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:]+");
Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){
buffer.append(matcher.group());
buffer.append("\r\n");
System.out.println(buffer.toString());
}
◆ 替换指定 {} 中文字
String str = "Java 目前的发展史是由 {0} 年 -{1} 年 ";
String[][] object={new String[]{"\\{0\\}","1995"},new String[]{"\\{1\\}","2007"}};
System.out.println(replace(str,object));
public static String replace(final String sourceString,Object[] object) {
String temp=sourceString;
for(int i=0;i<object.length;i++){
String[] result=(String[])object[i];
Pattern pattern = Pattern.compile(result[0]);
Matcher matcher = pattern.matcher(temp);
temp=matcher.replaceAll(result[1]);
}
return temp;
}
◆ 以正则条件查询指定目录下文件
// 用于缓存文件列表
private ArrayList files = new ArrayList();
// 用于承载文件路径
private String _path;
// 用于承载未合并的正则公式
private String _regexp;
class MyFileFilter implements FileFilter {
/**
* 匹配文件名称
*/
public boolean accept(File file) {
try {
Pattern pattern = Pattern.compile(_regexp);
Matcher match = pattern.matcher(file.getName());
return match.matches();
} catch (Exception e) {
return true;
}
}
}
/**
* 解析输入流
* @param inpu
/* 主要是为了能找出在一次匹配中你更关心的部分。
* 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 "(x)(y\\w*)(z)" 中,存在三个这样的组:
1. x
2. y\\w*
3. z*/
//m.group(2) return y123 y456
//m.group() return xy123z xy456z
@Test
public void test3(){
String regex = "(x)(y\\w*)(z)";
String input = "exy123z,xy456z";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(input);
while (m.find()) {
// System.out.println(m.group(2));
// System.out.println(m.groupCount());
System.out.println(m.group());
}
}