1.贪婪匹配

问题:给定一个字符串表示的数字,判断该数字末尾0的个数?

  • "123000": 3个0
  • "10100": 2个0
  • "1001": 0个0

先使用"^(\d+)(0*)$"匹配这三个字符串

  1. public class Phone{
  2. public static void matchForZero(String s){
  3. Pattern pattern = Pattern.compile("(\\d+)(0*)$");
  4. Matcher matcher = pattern.matcher(s);
  5. if (matcher.matches()){
  6. System.out.print("第一组数:"+matcher.group(1)+"\t");
  7. System.out.println("第二组数:"+matcher.group(2));
  8. }
  9. }
  10. }
  1. public class PhoneTest {
  2. @Test
  3. public void testMatchForZero(){
  4. Phone.matchForZero("123000");
  5. Phone.matchForZero("10100");
  6. Phone.matchForZero("1001");
  7. }
  8. }


结果:0并未匹配到,group1将整个字符串完全匹配
原因:正则表达式默认使用贪婪匹配,尽可能多的向后匹配

2.非贪婪匹配

1中的解决方法:使用?实现非贪婪匹配

修改方法,再次运行

  1. public class Phone{
  2. public static void matchForZero(String s){
  3. Pattern pattern = Pattern.compile("(\\d+?)(0*)$");// \d尽可能少的匹配,0尽可能多的匹配
  4. Matcher matcher = pattern.matcher(s);
  5. if (matcher.matches()){
  6. System.out.print("第一组数:"+matcher.group(1)+"\t");
  7. System.out.println("第二组数:"+matcher.group(2));
  8. }
  9. }
  10. }

3.区分非贪婪匹配与个数匹配

注意:?既能表示非贪婪匹配,也能表示0个或1个,所以要注意其含义

  1. public class Phone{
  2. public static void matchForZero(String s){
  3. Pattern pattern = Pattern.compile("(\\d??)(9*)$");
  4. //第一个?表示0个或1个,可以匹配0或1个9
  5. //第二个?表示非贪婪匹配,尽可能少的匹配,两者综合,即匹配0个
  6. Matcher matcher = pattern.matcher(s);
  7. if (matcher.matches()){
  8. System.out.print("第一组数:"+matcher.group(1)+"\t");
  9. System.out.println("第二组数:"+matcher.group(2));
  10. }
  11. }
  12. }
  1. public class PhoneTest {
  2. @Test
  3. public void testMatchForZero(){
  4. Phone.matchForZero("9999");
  5. }
  6. }

4.代码示例

4.1贪婪匹配

ZeroCount.java

  1. package com.testList;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. public class ZeroCount {
  5. public static int zeros(String s){
  6. Pattern pattern = Pattern.compile("^\\d+(0*)$");
  7. Matcher matcher = pattern.matcher(s);
  8. if(matcher.matches()){
  9. String zeroStr = matcher.group(1);
  10. return zeroStr.length();
  11. }
  12. throw new IllegalArgumentException("Not a number");
  13. }
  14. }

ZeroCountTest.java

  1. package com.testList;
  2. import org.junit.Test;
  3. import static org.junit.Assert.*;
  4. public class ZeroCountTest {
  5. @Test
  6. public void zeros() {
  7. assertEquals(0, ZeroCount.zeros("123456"));
  8. assertEquals(1, ZeroCount.zeros("123450"));
  9. assertEquals(2, ZeroCount.zeros("123400"));
  10. assertEquals(3, ZeroCount.zeros("123000"));
  11. assertEquals(4, ZeroCount.zeros("120000"));
  12. assertEquals(2, ZeroCount.zeros("100100"));
  13. }
  14. }

4.2非贪婪匹配

  1. package com.testList;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. public class ZeroCount {
  5. public static int zeros(String s){
  6. Pattern pattern = Pattern.compile("^\\d+?(0*)$");
  7. Matcher matcher = pattern.matcher(s);
  8. if(matcher.matches()){
  9. String zeroStr = matcher.group(1);
  10. return zeroStr.length();
  11. }
  12. throw new IllegalArgumentException("Not a number");
  13. }
  14. }

5.总结

  • 正则表达式匹配默认使用贪婪匹配
  • 使用?表示对某一规则进行非贪婪匹配
  • 注意区分?的含义 \d??

廖雪峰Java9正则表达式-2正则表达式进阶-5非贪婪匹配的更多相关文章

  1. Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配

    Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配 //贪婪匹配 var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Create(nil);   ...

  2. 正则表达式 整理(\w \s \d 点 贪婪匹配 非贪婪匹配 * + ? {} | [] ^ $ \b 单词边界 分组、re.findall()、re.split()、re.search()、re.match()、re.compile()、re.sub())

    re.findall  匹配到正则表达式的字符,匹配到的每个字符存入一个列表,返回一个匹配到的所有字符列表 一. 匹配单个字符 import re # \w 匹配所有字母.数字.下划线 re.find ...

  3. VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,中文正则,倒数第二列, 匹配任意一个字符 :

    VIM 用正则表达式 批量替换文本,多行删除,复制,移动 在VIM中 用正则表达式 批量替换文本,多行删除,复制,移动 :n1,n2 m n3     移动n1-n2行(包括n1,n2)到n3行之下: ...

  4. 廖雪峰Java9正则表达式-2正则表达式进阶-3分组匹配

    1.使用括号可以提取字符串 不加括号匹配电话号码 匹配成功后,如何提取想要的字符串? 使用(...)可以分组:"^(\d{3,4})\-(\d{6,8})$" 2.String.m ...

  5. 廖雪峰Java9正则表达式-2正则表达式进阶-6搜索和替换

    1.使用正则表达式分割字符串: String[] string.split(String regex); "a b c".split("\\s");->[ ...

  6. 廖雪峰Java9正则表达式-1正则表达式入门-2正则表达式匹配规则

    正则表达式的匹配规则: 从左到右按规则匹配 匹配规则及示例 可以匹配 不能匹配 "abc" "abc" 不能匹配:"ab", "A ...

  7. 廖雪峰Java9正则表达式-1正则表达式入门-1正则表达式简介

    1.使用代码来判断字符串 场景: 判断字符串是否是有效的电话号码:"010-12345678", "123ABC456" 判断字符串是否是有效的电子邮箱地址:& ...

  8. vim下正则表达式的非贪婪匹配

    贪婪模式是: .* 非贪婪模式是: .\{-}

  9. python正则表达式贪婪与非贪婪模式

    之前做程序的时候看到过正则表达式的贪婪与非贪婪模式,今天用的时候就想不起来了,现在这里总结一下,以备自己以后用到注意. 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="a ...

随机推荐

  1. 一阶段项目 总结 之 两张图片对比 手写 jquery 也可以使用beer slider 插件

    <!DOCTYPE html><html> <head>  <meta charset="utf-8">  <title> ...

  2. HTML 参考手册web

    { https://www.w3school.com.cn/tags/index.asp }

  3. svg实现渐变进度圆环

    效果图 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="ut ...

  4. 现金贷平台下载量TOP100 涉逾30家P2P

    一.什么是现金贷,现状如何 那么什么是现金贷呢?在笔者看来,狭义的现金贷主要是指基于互联网等技术手段的小额现金贷款,广义的现金贷可以包括任何以小额现金和存款为标的进行借贷的行为,是一种无担保.无抵押. ...

  5. RPC远程过程调用实例详解

    1.创建IDL文件,定义接口. IDL文件可以由uuidgen.exe创建. 首先找到系统中uuidgen.exe的位置,如:C:\Program Files\Microsoft Visual Stu ...

  6. 普通的maven项目变成web项目

    command+: 或者 这个修改同样可以解决idea中不能新建servlet的问题. 这里最后的目录结构是这样的,如果在上面的设置中尝试修改目录,会导致无法创建servlet,比如我希望将根目录改成 ...

  7. div中包着文字,div出现隐藏的时候,文字总是在div外面。

    背景: 给博客加一个侧边栏,点击出现隐藏,每次点击出现或者隐藏,文字总是很突兀的就出来了. 解决: overflow:hidden

  8. reboot与shutdown -r now 区别与联系(又收集了init和halt的小知识)

    在linux命令中reboot是重新启动,shutdown -r now是立即停止然后重新启动,都说他们两个是一样的,其实是有一定的区别的. shutdown命令可以安全地关闭或重启Linux系统,它 ...

  9. 左神算法进阶班1_1添加最少字符得到原字符N次

    Problem: 给定一个字符串str1,只能往str1的后面添加字符变成str2. 要求1:str2必须包含两个str1,两个str1可以有重合,但是不能以同一个位置开头. 要求2:str2尽量短最 ...

  10. Spring - 框架入门

    认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP( ...