常用的元字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
大写为取反,^也为取反,(如:\D为除数字以外任意字符,[^5]为非5的字符)
量词
{n} | 表达式重复n次(如:表达式 \d{6} 为匹配6个数字) |
{m,n} | 表达式至少重复m次,最多重复n次 |
{m,} | 表达式至少重复m次 |
? | 表达式0次或者1次 |
+ | 表达式至少出现了1次,相当与{1,} |
* | 表达式出现任意次,相当于{0,} |
字符边界
\b | 匹配单词的开始或结束。(如:表达式 \b123\b 为匹配123左右边的字符不是\w) |
^ | 匹配字符串的开始,如果指定了多行模式,则需要使用 \A |
$ | 匹配字符串的结束,如果指定了多行模式,则需要使用 \Z |
选择符和分组
| | 或 |
() | (1)、在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰 (2)、每一对括号会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本,用 \1 来获取(1为编号)。(如:表达式(/w/w)\1 的含义为,/w/w匹配出的字符假设为go、to、ls……,那么\1的位置就代表go、to、ls……,整个表达式匹配的结果就为gogo、toto、lsls……)。 |
(?:Expression)非捕获组 | 一些表达式中,不得不使用(),但又不需要保存()中表达式匹配的内容,这时可以用非捕获组来抵消使用()带来的副作用。 |
预搜索(零宽断言)
(?=exp) | 断言自身出现的位置的后面能匹配表达式exp |
(?<=exp) | …………………………前面能匹配表达式exp |
(?!exp) | …………………………后面不能匹配表达式exp |
(?<!exp) | …………………………前面不匹配表达式exp |
如:[a-z]{0,}匹配出的字符,后面加上(?=ing)就会找出后缀为ing的字符
(?<=sw)ing匹配出的为sw开头的ing
练习:
匹配邮箱:[\w\-]+表示匹配任意数量的字母、数字、下划线、-,@匹配@,[a-z0-9A-Z]+表示匹配任意数量的字母、数字,\.[A-Za-z]{2,4}匹配 .后2~4为字母,(\.[A-Za-z]{2,4}){1,2}匹配括号内的表达式1~2次
在Java中的运用:
public static void fun1(){
//在这个字符串:asfsdsalkj123154564,是否符合指定的正则表达式:\w+
//表达式对象
Pattern p =Pattern.compile("\\w+");
//创建Matcher对象
Matcher m = p.matcher("asfsdsalkj123154564");
boolean yesOrno = m.matches();
System.out.println(yesOrno);
}
public static void fun2(){
//表达式对象
Pattern p =Pattern.compile("\\w+");
//创建Matcher对象
Matcher m = p.matcher("asfsdsalk&&j123154564");
System.out.println(m.find());
System.out.println(m.group());//第一个子字符串 asfsdsalk
System.out.println(m.find());
System.out.println(m.group());//第二个子字符串 j123154564
System.out.println(m.find());
// System.out.println(m.group());//第三个子字符串,这里没找到
}
public static void fun3(){
//表达式对象
Pattern p =Pattern.compile("([a-z]+)([0-9]+)");
//创建Matcher对象
Matcher m = p.matcher("aa322**sdk333$#sds234");
while (m.find()){
System.out.println(m.group()); //group(),group(0)匹配整个表达式的子字符串,第一次为aa332
System.out.println(m.group(1));//按照([a-z]+)匹配,第一次为aa
System.out.println(m.group(2));//按照([0-9]+)匹配,第一次为322
}
}
public static void fun4(){
//表达式对象
Pattern p =Pattern.compile("[0-9]");
//创建Matcher对象
Matcher m = p.matcher("aa322**sdk333$#sds234");
//将匹配到的字符都替换成#,生成新的字符串
String newStr = m.replaceAll("#");
System.out.println(newStr);
}
public static void fun5(){
String str = "a121321b3234c44";
String[] split = str.split("\\d+");
System.out.println(Arrays.toString(split));
}