专栏首页bisal的个人杂货铺正则表达式的贪婪和非贪婪模式

正则表达式的贪婪和非贪婪模式

最近在写程序时,碰到一个场景,需要找到一个字符串中指定的一个片段,而不是所有片段,这就涉及到正则表达式中贪婪和非贪婪两种模式。

字面意思上,正则表达式一般趋向于最大长度匹配,就是贪婪模式。匹配到结果就好,就少的匹配字符,就是非贪婪模式

直接上个例子,

String str="abcaxc";
Patter p="ab.*c";

如果是贪婪模式,上面使用模式p匹配字符串str,结果就是匹配到:abcaxc,匹配到了所有的字符串。

如果是非贪婪模式,上面使用模式p匹配字符串str,结果就是匹配到:abc,只匹配到了部分的字符串。

编程中怎样区分这两种模式?

默认情况下,正则用的都是贪婪模式,如果要使用非贪婪模式,需要在量词后面直接加上一个问号"?",量词包括如下,

(1) {m,n}:m到n个。

(2) *:任意多个。

(3) +:一个到多个。

(4) ?:0或一个。

再上个程序,用贪婪和非贪婪模式找到content中的内容,

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


public class RegularTest {
  public static void main(String[] arg) {
    String text = "(content:\"hello root\";hello:\"word\";)";
    String rule1 = "content:\".+\"";  // 贪婪模式
    String rule2 = "content:\".+?\""; // 非贪婪模式


    System.out.println("文本:" + text);
    System.out.println("贪婪模式:" + rule1);
    Pattern p1 = Pattern.compile(rule1);
    Matcher m1 = p1.matcher(text);
    while (m1.find()) {
      System.out.println("匹配结果:" + m1.group(0));
    }


    System.out.println("非贪婪模式:" + rule2);
    Pattern p2 = Pattern.compile(rule2);
    Matcher m2 = p2.matcher(text);
    while (m2.find()) {
      System.out.println("匹配结果:" + m2.group(0));
    }
  }
}

如果是贪婪模式,返回两个字符串,而非贪婪模式,则只返回第一个,

文本:(content:"hello root";hello:"word";)
贪婪模式:content:".+"
匹配结果:content:"hello root";hello:"word"
非贪婪模式:content:".+?"
匹配结果:content:"hello root"

针对不同场景,我们就可以选择合适的模式。

参考资料,

https://www.cnblogs.com/xudong-bupt/p/3586889.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 正则表达式之贪婪匹配 VS 非贪婪匹配

    我们知道,许多程序设计语言都支持利用功能强大的正则表达式进行字符串操作,SAS中也有用正则表达式的PRX Function,平时在写正则表达式的时候会常碰到贪婪...

    专业余码农
  • 全网最易懂的正则表达式教程(8 )- 贪婪模式和非贪婪模式

    https://www.cnblogs.com/poloyy/category/1796055.html

    小菠萝测试笔记
  • Python 正则表达式(贪婪和非贪婪模式)- 匹配颜值美女图片URL

    Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

    Devops海洋的渔夫
  • 正则表达式懒惰贪婪和replace函数

    看到这个,我的内心是崩溃的。 你没有学过正则表达式吗? 他说学过。 他说学过,他竟然说学过。。。

    用户3158888
  • 正则表达式1.正则表达式概述2.re模块操作3.表示字符4.re模块的高级用法5.贪婪和非贪婪

    在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re

    Python攻城狮
  • Python正则表达式初识(二)

    前几天给大家分享了Python正则表达式初识(一),介绍了正则表达式中的三个特殊字符“^”、“.”和“*”,感兴趣的伙伴可以戳进去看看,今天小编继续给大家分享P...

    Python进阶者
  • Python正则表达式初识(二)

    前几天给大家分享了Python正则表达式初识(一),介绍了正则表达式中的三个特殊字符“^”、“.”和“*”,感兴趣的伙伴可以戳进去看看,今天小编继续给大家分享P...

    Python进阶者
  • Python正则表达式初识(二)

    前几天给大家分享了Python正则表达式初识(一),介绍了正则表达式中的三个特殊字符“^”、“.”和“*”,感兴趣的伙伴可以戳进去看看,今天小编继续给大家分享P...

    Python进阶者
  • 正则表达式学习笔记-高级篇

    前面已经写过一篇文章《我眼里的正则表达式(入门)》介绍过正则表达式的基础和基本套路正则三段论:定锚点,去噪点,取数据了,接下来这篇文章,补充一点相对高级的概念:

    一头小山猪
  • Python爬虫10-页面解析数据提取思

    py3study
  • 熬夜到虚脱整理出来的Python的正则表达式总结

    1.正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

    sergiojune
  • python正则表达式的懒惰匹配和贪婪匹配说明

    第一次碰到这个问题的时候,确实不知道该怎么办,后来请教了一个大神,加上自己的理解,才了解是什么意思,这个东西写python的会经常用到,而且会特别频繁,在此写一...

    砸漏
  • 正则表达式 入门

    许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。

    Java3y
  • Python笔记(十):正则表达式

    正则表达式对比工具 https://pan.baidu.com/s/1XIPyF1vFSj5PACPx9zW8_g (一)      正则表达式符号和特殊字符 ...

    free赖权华
  • 说说Python中贪婪和非贪婪匹配?

    小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。

    程序IT圈
  • 5分钟轻松学正则表达式

    这个表达式可以接受 john_doe、jo-hn_doe、john12_as,但是无法匹配到 Jo,因为它包含了大写的字母而且太短了。

    dongfanger
  • Python自动化测试-正则表达式解析

    对于正则表达式,第一眼时觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。其实唯一难的就是组合起来之后,可读性比较差,而且不容易理解,其实能看...

    ITester软件测试小栈
  • Python自动化测试-正则表达式解析

    对于正则表达式,第一眼时觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。其实唯一难的就是组合起来之后,可读性比较差,而且不容易理解,其实能看...

    louiezhou001
  • 面试官:你竟然连这么简单的正则表达式都不会写?

    正则表达式在几乎所有语言中都可以使用,无论是前端的JavaScript、还是后端的Java、c#。他们都提供相应的接口/函数支持正则表达式。

    用户5224393

扫码关注云+社区

领取腾讯云代金券