廖雪峰Java9正则表达式-2正则表达式进阶-5非贪婪匹配
1.贪婪匹配
问题:给定一个字符串表示的数字,判断该数字末尾0的个数?
- "123000": 3个0
- "10100": 2个0
- "1001": 0个0
先使用"^(\d+)(0*)$"匹配这三个字符串
public class Phone{
public static void matchForZero(String s){
Pattern pattern = Pattern.compile("(\\d+)(0*)$");
Matcher matcher = pattern.matcher(s);
if (matcher.matches()){
System.out.print("第一组数:"+matcher.group(1)+"\t");
System.out.println("第二组数:"+matcher.group(2));
}
}
}
public class PhoneTest {
@Test
public void testMatchForZero(){
Phone.matchForZero("123000");
Phone.matchForZero("10100");
Phone.matchForZero("1001");
}
}

结果:0并未匹配到,group1将整个字符串完全匹配
原因:正则表达式默认使用贪婪匹配,尽可能多的向后匹配
2.非贪婪匹配
1中的解决方法:使用?实现非贪婪匹配
修改方法,再次运行
public class Phone{
public static void matchForZero(String s){
Pattern pattern = Pattern.compile("(\\d+?)(0*)$");// \d尽可能少的匹配,0尽可能多的匹配
Matcher matcher = pattern.matcher(s);
if (matcher.matches()){
System.out.print("第一组数:"+matcher.group(1)+"\t");
System.out.println("第二组数:"+matcher.group(2));
}
}
}

3.区分非贪婪匹配与个数匹配
注意:?既能表示非贪婪匹配,也能表示0个或1个,所以要注意其含义
public class Phone{
public static void matchForZero(String s){
Pattern pattern = Pattern.compile("(\\d??)(9*)$");
//第一个?表示0个或1个,可以匹配0或1个9
//第二个?表示非贪婪匹配,尽可能少的匹配,两者综合,即匹配0个
Matcher matcher = pattern.matcher(s);
if (matcher.matches()){
System.out.print("第一组数:"+matcher.group(1)+"\t");
System.out.println("第二组数:"+matcher.group(2));
}
}
}
public class PhoneTest {
@Test
public void testMatchForZero(){
Phone.matchForZero("9999");
}
}

4.代码示例
4.1贪婪匹配
ZeroCount.java
package com.testList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ZeroCount {
public static int zeros(String s){
Pattern pattern = Pattern.compile("^\\d+(0*)$");
Matcher matcher = pattern.matcher(s);
if(matcher.matches()){
String zeroStr = matcher.group(1);
return zeroStr.length();
}
throw new IllegalArgumentException("Not a number");
}
}
ZeroCountTest.java
package com.testList;
import org.junit.Test;
import static org.junit.Assert.*;
public class ZeroCountTest {
@Test
public void zeros() {
assertEquals(0, ZeroCount.zeros("123456"));
assertEquals(1, ZeroCount.zeros("123450"));
assertEquals(2, ZeroCount.zeros("123400"));
assertEquals(3, ZeroCount.zeros("123000"));
assertEquals(4, ZeroCount.zeros("120000"));
assertEquals(2, ZeroCount.zeros("100100"));
}
}

4.2非贪婪匹配
package com.testList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ZeroCount {
public static int zeros(String s){
Pattern pattern = Pattern.compile("^\\d+?(0*)$");
Matcher matcher = pattern.matcher(s);
if(matcher.matches()){
String zeroStr = matcher.group(1);
return zeroStr.length();
}
throw new IllegalArgumentException("Not a number");
}
}

5.总结
- 正则表达式匹配默认使用贪婪匹配
- 使用?表示对某一规则进行非贪婪匹配
- 注意区分?的含义 \d??
廖雪峰Java9正则表达式-2正则表达式进阶-5非贪婪匹配的更多相关文章
- Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配
Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配 //贪婪匹配 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); ...
- 正则表达式 整理(\w \s \d 点 贪婪匹配 非贪婪匹配 * + ? {} | [] ^ $ \b 单词边界 分组、re.findall()、re.split()、re.search()、re.match()、re.compile()、re.sub())
re.findall 匹配到正则表达式的字符,匹配到的每个字符存入一个列表,返回一个匹配到的所有字符列表 一. 匹配单个字符 import re # \w 匹配所有字母.数字.下划线 re.find ...
- VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,中文正则,倒数第二列, 匹配任意一个字符 :
VIM 用正则表达式 批量替换文本,多行删除,复制,移动 在VIM中 用正则表达式 批量替换文本,多行删除,复制,移动 :n1,n2 m n3 移动n1-n2行(包括n1,n2)到n3行之下: ...
- 廖雪峰Java9正则表达式-2正则表达式进阶-3分组匹配
1.使用括号可以提取字符串 不加括号匹配电话号码 匹配成功后,如何提取想要的字符串? 使用(...)可以分组:"^(\d{3,4})\-(\d{6,8})$" 2.String.m ...
- 廖雪峰Java9正则表达式-2正则表达式进阶-6搜索和替换
1.使用正则表达式分割字符串: String[] string.split(String regex); "a b c".split("\\s");->[ ...
- 廖雪峰Java9正则表达式-1正则表达式入门-2正则表达式匹配规则
正则表达式的匹配规则: 从左到右按规则匹配 匹配规则及示例 可以匹配 不能匹配 "abc" "abc" 不能匹配:"ab", "A ...
- 廖雪峰Java9正则表达式-1正则表达式入门-1正则表达式简介
1.使用代码来判断字符串 场景: 判断字符串是否是有效的电话号码:"010-12345678", "123ABC456" 判断字符串是否是有效的电子邮箱地址:& ...
- vim下正则表达式的非贪婪匹配
贪婪模式是: .* 非贪婪模式是: .\{-}
- python正则表达式贪婪与非贪婪模式
之前做程序的时候看到过正则表达式的贪婪与非贪婪模式,今天用的时候就想不起来了,现在这里总结一下,以备自己以后用到注意. 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="a ...
随机推荐
- 【JZOJ6375】华灵[蝶妄想]
description analysis 明显括号序长度是偶数,如果其中一个是奇数,那么只能让这奇数行或列是括号序 对于两个都是偶数,需要分类讨论,假设\(n<m\) 有一种是牺牲掉\(n\ov ...
- CSS3——2D变形和3D变形
2D变形(CSS3) transform transform是CSS3中具有颠覆性的特征之一,可以实现元素的位移.旋转.倾斜.缩放,甚至支持矩阵方式,配合过渡和即将学习的动画知识,可以取代大量之前只能 ...
- http://www.jianshu.com/简书。
http://www.jianshu.com/ 简书,类似于博客园.也是一个交流平台.
- 14. TIM of STM32F103ZE
block diagram 14.3.1 Time-base unit 有三个基础的寄存器: 计数寄存器(TIMx_CNT) 预分配寄存器(TIMx_PSC), 自动重载寄存器(TIMx_ARR) 重 ...
- codeforces 1100D-Dasha and Chess
传送门:QAQQAQ 题意:This is an interactive task. 999*999国际象棋棋盘中有一个王和666个车,玩家走王,电脑走车,玩家先走,玩家的目的是让对方的车将到自己的王 ...
- PAT甲级——A1117 Eddington Number【25】
British astronomer Eddington liked to ride a bike. It is said that in order to show off his skill, h ...
- T2960 全民健身【思维Dp,预处理,差分优化】
Online Judge:YCJSOI Label:Dp,思维题,预处理,滚动优化 题目描述 乐乐现在掌管一个大公司,办公楼共有n层.为了增加员工的身体素质,他决定在每层楼都建立一个活动室,活动室分乒 ...
- Georgia and Bob
Georgia and Bob 给出一个严格递增的正整数数列\(\{a_i\}\),每一次操作可以对于其中任意一个数减去一个正整数,但仍然要保证数列的严格递增性,现在两名玩家轮流操作,不能操作的玩家判 ...
- 【JZOJ3319】雪地踪迹
description 森林里有一片长方形的草地,在清晨的大雪过后被一层厚厚的积雪所掩盖(下图左). 住在森林里的兔子和狐狸,穿越草地,都会在雪地上留下他们的踪迹.他们总是从左上角进入,并从右下角离开 ...
- 拦截器和自定义注解@interface
1 .拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在Handler执行之前或之后加入某些操作,其实就是AOP的一种实现策略. 拦截用户的请求并进行相应的处理,比如:判断用 ...