正则表达式的各种符号及其含义
常用的符号
. 表示任意一个字符
\s 空格字符(空格键, tab, 换行, 换页, 回车)
\S 非空格字符([^\s])
\d 一个数字,(相当于[0-9] )
\D 一个非数字的字符,(相当于[^0-9] )
\w 一个单词字符(word character) (相当于 [a-zA-Z_0-9] )
\W 一个非单词的字符,[^\w]
^ 一行的开始
$ 一行的结尾
\b 一个单词的边界
\B 一个非单词的边界
\G 前一个匹配的结束
[ ] 匹配方括号内的一个字符
例如:[abc] 表示字符a,b,c 中的任意一个(与a|b|c 相同)
[a-zA-Z] a z A Z
表示从 到 或 到 当中的任意一个字符
“^”符号称为“否”符号。如果用在方括号内,“^”表示不想要匹配的字符
表示次数的符号
* 重复零次或更多次
例如:a* 匹配零个或者多个a
+ 重复一次或更多次
例如:a+ 匹配一个或者多个a
? 重复零次或一次
例如:a? 匹配零个或一个a
{n} 重复n 次
例如:a{4} 匹配4 个a
{n,} 重复n 次或更多次
例如:a{4,} 匹配至少4 个a
{n,m} 重复n 到m 次
例如:a{4,10} 匹配4~10 个a
package lx.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexStudy {
Pattern mPattern;
Matcher mMatcher;
void setRegexAndInput(String regex, CharSequence input) {
setRegexAndInput(regex, 0, input);
}
void setRegexAndInput(String regex, int flags, CharSequence input) {
mPattern = Pattern.compile(regex, flags);
mMatcher = mPattern.matcher(input);
System.out.println("match result----> " + mMatcher.matches() + "\n");
}
void test1() {
// 表示首字母是a,中间是任意字符,结尾以b结束
setRegexAndInput("a*b", "baaaab");
}
void test2() {
// 表示第一位是1,第二位为3或5,结尾为9位数字的一串数字
setRegexAndInput("^[1][3,5]+\\d{9}", "13812345678");
}
void test3() {
// 表示15位或者18位数字的一串数字
setRegexAndInput("\\d{15}|\\d{18}", "120101198506020080");
}
void test4() {
// 表示匹配邮箱号码
setRegexAndInput("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*", "lx@163.com");
}
void test5() {
// 表示匹配所有123-12-1234形式的号码
setRegexAndInput("[0-9]{3}\\-[0-9]{2}\\-[0-9]{4}", "454-17-7775");
}
void test6() {
// 表示匹配四个数字加上二个字母
setRegexAndInput("[0-9]{4}[A-Z]{2}", "4843QR");
}
void test7() {
// 表示匹配所有单词,但“X”开头的除外
setRegexAndInput("^[^X]", "AAXXX");
}
void test8() {
// 表示匹配所有单词,但“X”开头的除外。。。有问题!
// FIXME
setRegexAndInput("([a-z]+)\\s+[0-9]{1,2},\\s*[0-9]{4}", "June 14, 1634");
}
void test9() {
// 表示匹配IP地址
setRegexAndInput("\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}", "192.168.1.1");
}
void test10() {
// 表示匹配汉字字符串
setRegexAndInput("^[\u4e00-\u9fa5]+$", "貂禅");
}
void test11() {
/*
* 匹配查找符合pattern的字符串 start()返回匹配到的子字符串在字符串中的索引位置.
* end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置. group()返回匹配到的子字符串
*/
setRegexAndInput("java", Pattern.CASE_INSENSITIVE, "java JAVA Java java");// 不顾大小写
while (mMatcher.find()) {
System.out.println("result---> " + mMatcher.group() + "\nStart from---> " + mMatcher.start() + " to---> "
+ mMatcher.end() + ".\n");
}
}
void test12() {
/*
* 本例groupCount将返回三组a11bbb、11、bbb
*/
setRegexAndInput("\\w(\\d\\d)(\\w+)", "aa11bbb");
if (mMatcher.find()) {
int count = mMatcher.groupCount(); // 返回匹配组的数目,而不是匹配字符
for (int i = 0; i <= count; i++)
System.out.println("group " + i + " :" + mMatcher.group(i));
}
}
void test13() {
mPattern = Pattern.compile("\\d+"); // 将所含数字去掉
String str[] = mPattern.split("aa11bbb33cc55gg");
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
}
void test14() {
// 将所含数字全部替换为XX
setRegexAndInput("\\d+", "aa11bbb33cc55gg");
String str = mMatcher.replaceAll("XX");
System.out.println(str);
}
void test15() {
setRegexAndInput("55", "aa11bbb33cc55gg55yy");
StringBuffer sb = new StringBuffer();
while (mMatcher.find()) {
mMatcher.appendReplacement(sb, "@@"); // 用@@替换所有的55
}
System.out.println(sb.toString()); // 打印aa11bbb33cc@@gg@@
mMatcher.appendTail(sb); // 将最后一次替换后的字符串加上
System.out.println(sb.toString()); // 打印aa11bbb33cc@@gg@@yy
}
/**
* 常用的正则表达式
*/
// email 正确的书写格式为 username@domain
static String _email = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
// 电话 正确格式 012-87654321、0123-87654321、0123-7654321
static String _tel = "\\d{4}-\\d{8}|\\d{4}-\\d{7}|\\d(3)-\\d(8)";
// 手机号码 13187654321 13587654321
static String _phone = "^[1][3,5]+\\d{9}";
// 汉字 中国
static String _chinse = "^[\u4e00-\u9fa5]+$";
// IP 192.168.1.1
static String _ip = "\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}";
// QQ 456789
static String _qq = "[1-9][0-9]{4,13}";
// 邮编 210000
static String _mail = "[1-9]\\d{5}(?!\\d)";
// 身份证号码 15或者18位
static String _id = "\\d{15}|\\d{18}";
public static void main(String[] args) {
new RegexStudy().test15();
}
}