JAVA 正则表达式

Pattern、Matcher、切割、替换等其他字符串操作:https://blog.csdn.net/weixin_43732798/article/details/100081039

 

标准字符集合

注意区分大小写,大写是相反的意思

字符描述
\d匹配0-9中的一个数字
\w任意一个字母或数字或下划线,即[A-Za-z0-9_]
\s匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。
.匹配任意一个字符(除了\n换行符),如果要匹配包括\n在内的所用字符,一般用[\s\S]

例子

public class Main {
	
	public static void main(String[] args) {
		String str1 = "1230958";
		String str2 = "1209x";
		String regex1 = "\\d+";//匹配数字
		String regex2 = "\\w+";//匹配字母、数字、下划线
		System.out.println(str1.matches(regex1));//输出true
		System.out.println(str1.matches(regex2));//输出true
		System.out.println(str2.matches(regex1));//输出false
		System.out.println(str2.matches(regex2));//输出true
	}
	
}

 

 

自定义字符集合

[ ]方括号匹配方式,能够匹配方括号中任意一个字符

自定义集合描述
[ab5@]匹配“a”或“b”或“5”或“@”
[^123]匹配除“1”,“2”,“3”之外的任意一个字符
[a-z]匹配小写字母a-z中的任意一个
[^A-Z0-3]匹配"A"-"Z","0"-"3"之外的任意一个字符
  • 正则表达式的特殊符号如果被包含到中括号中,则失去特殊意义,除了^和-之外
  • 标准字符集合,除小数点外,如果被包含于中括号,自定义字符集合将包含该集合,比如[\d.\-+]将匹配:数字、小数点、-、+

例子

public class Main {
	
	public static void main(String[] args) {
		String str1 = "123456789";
		String str2 = "234567891";
		String str3 = "456789123";
		String regex = "[123]\\d{8}";//匹配1或2或3开头的9位数的数字
		System.out.println(str1.matches(regex));//输出true
		System.out.println(str2.matches(regex));//输出true
		System.out.println(str3.matches(regex));//输出false
	}
	
}

 

转义字符

字符描述
\n换行符
\t制表符
\\代表\本身
\^, \$, \(, \), \{, \}, \?, \+, \*, \|, \[, \]匹配这些字符本身

量词

修饰匹配次数

符号描述
{n}表达式重复n次
{m,n}表达式最少重复m次,最多n次
{m,}表达式至少重复m次
?匹配表达式0次或1次,相当于{0,1}
+表达式至少出现1次,相当于{1,}
*表达式出现任意次,相当于{0,}
  • 贪婪模式:匹配字符越多越好,默认
  • 非贪婪模式:匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个"?"号

例子

public class Main {
	
	public static void main(String[] args) {
		String str1 = "11112";
		String regex1 = "1+?";//匹配一次“1”
		String regex2 = "1+";//匹配多次“1”
		
		//将匹配到的字符串用#代替
		System.out.println(str1.replaceAll(regex1, "#"));//输出####2
		System.out.println(str1.replaceAll(regex2, "#"));//输出#2
	}
	
}

 

 

字符边界

字符描述
^与字符开始的地方匹配
$与字符结束的地方匹配
\b匹配一个单词边界(表示空格、换行等)

匹配模式

模式描述

Pattern.CASE_INSENSITIVE--忽略大小写模式

匹配时忽略大小写

Pattern.MULTILINE--多行模式

  • 每行都是一个字符串,都有开头和结尾
  • 如果仅需匹配字符串的开始和结束位置,可以使用\A和\Z
默认模式--单行模式
  • 整个文本看作一个字符串,只有一个开头,一个结尾
  • 使小数点"."可以匹配到换行符(\n)在内的任意字符

 

Pattern.CASE_INSENSITIVE--忽略大小写模式

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	
	public static void main(String[] args) {
		String str = "abcD";
		Pattern p = Pattern.compile("[a-z]+");//匹配小写a-z
		Matcher m = p.matcher(str);
		System.out.println(m.matches());//输出false
		
		p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);//忽略大小写
		m = p.matcher(str);
		System.out.println(m.matches());//输出true
	}
	
}

 

Pattern.MULTILINE例子---多行模式

 

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	
	public static void main(String[] args) {

        String str="hello word\n"//字符串
        		+ "hello java\n"
        		+ "hello java\n";

        System.out.println("字符串str:\n"+str);//输出字符串
        
        System.out.println("-----------匹配字符串开头(单行模式)-----------");
        Pattern p = Pattern.compile("^hello");
        Matcher m = p.matcher(str);
        while(m.find()){
            System.out.println(m.group()+"   位置:["+m.start()+","+m.end()+"]");
        }
        
        System.out.println("-----------匹配字符串结尾(单行模式)-----------");
        p=Pattern.compile("java$");
        m=p.matcher(str);
        while(m.find()){
            System.out.println(m.group()+"   位置:["+m.start()+","+m.end()+"]");
        }
        
        
        System.out.println("\n------------------分割线------------------\n");
        
        
        System.out.println("-----------匹配字符串开头(多行模式)-----------");
        p=Pattern.compile("^hello",Pattern.MULTILINE);
        m=p.matcher(str);
        while(m.find()){
            System.out.println(m.group()+"   位置:["+m.start()+","+m.end()+"]");
        }

        System.out.println("-----------匹配字符串结尾(多行模式)-----------");
        p=Pattern.compile("java$",Pattern.MULTILINE);
        m=p.matcher(str);
        while(m.find()){
            System.out.println(m.group()+"   位置:["+m.start()+","+m.end()+"]");
        }

    
        System.out.println("\n------------------分割线------------------\n");
        
        
        System.out.println("-----------匹配字符串开头(多行模式,仅匹配开头和结尾)-----------");
        p=Pattern.compile("\\Ahello",Pattern.MULTILINE);
        m=p.matcher(str);
        while(m.find()){
            System.out.println(m.group()+"   位置:["+m.start()+","+m.end()+"]");
        }

        System.out.println("-----------匹配字符串结尾(多行模式,仅匹配开头和结尾)-----------");
        p=Pattern.compile("java\\Z",Pattern.MULTILINE);
        m=p.matcher(str);
        while(m.find()){
            System.out.println(m.group()+"   位置:["+m.start()+","+m.end()+"]");
        }
	}
	
}

输出

字符串str:
hello word
hello java
hello java

-----------匹配字符串开头(单行模式)-----------
hello   位置:[0,5]
-----------匹配字符串结尾(单行模式)-----------
java   位置:[28,32]

------------------分割线------------------

-----------匹配字符串开头(多行模式)-----------
hello   位置:[0,5]
hello   位置:[11,16]
hello   位置:[22,27]
-----------匹配字符串结尾(多行模式)-----------
java   位置:[17,21]
java   位置:[28,32]

------------------分割线------------------

-----------匹配字符串开头(多行模式,仅匹配开头和结尾)-----------
hello   位置:[0,5]
-----------匹配字符串结尾(多行模式,仅匹配开头和结尾)-----------
java   位置:[28,32]

 

匹配边界

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	
	public static void main(String[] args) {
		String str = "abc 2ew e12 e";
		Pattern p = Pattern.compile("\\b[A-Za-z].*?\\b");//匹配以字母开头的字符串
		Matcher m = p.matcher(str);
		while ( m.find() ) {
			System.out.println(m.group()+"  位置:["+m.start()+", "+m.end()+"]");
		}
	}
	
}

输出

abc  位置:[0, 3]
e12  位置:[8, 11]
e  位置:[12, 13]

 

 

选择符和分组

表达式作用
|分支结构“或”的意思,匹配左边或右边
()捕获组
  1. 在被修饰匹配次数时的时候,括号中的表达式可以作为整体被修饰
  2. 取匹配结果时,括号中表达式匹配到的内容可以单独被获取
  3. 每一对括号会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号,编号为0是整个表达式
(?:Expression)非捕获组一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配的内容,这时可以使用非捕获组来抵消使用()带来的副作用

反向引用(\n)

通过反向引用,可以对分组以捕获的字符串进行引用

例子

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	
	public static void main(String[] args) {
		String str = "gogo toto nonono";
		String regex = "([a-z]{2})\\1";//匹配ABAB形式的小写字母
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(str);
		while ( m.find() ) {
			System.out.println(m.group());
		}
		
		System.out.println("\n------------------分割线------------------\n");
		
		regex = "([a-z]{2})\\1{2}";//匹配ABABAB形式的小写字母
		p = Pattern.compile(regex);
		m = p.matcher(str);
		while ( m.find() ) {
			System.out.println(m.group());
		}
	}
	
}

输出

gogo
toto
nono

------------------分割线------------------

nonono

 

 

预搜索(零宽断言)

  • 只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度
  • 这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符,是对位置的匹配。
  • 正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的。如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的,占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果而言的。
字符描述
(?=exp)自身出现的位置的后面能匹配表达式exp
(?<=exp)自身出现的位置的前面能匹配表达式exp
(?!exp)自身出现的位置的后面不能匹配表达式exp
(?<!exp)自身出现的位置的前面不能匹配表达式exp

例子

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	
	public static void main(String[] args) {
		String str = "going doing";
		String regex = "[a-z]+(?=ing)";//匹配xxing形式的字符串
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(str);
		while ( m.find() ) {
			System.out.println(m.group());
		}
		
		
	}
	
}

输出

go
do

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值