解析正则表达式中的.*,.*?,.+?的含义

1. .*

. 表示匹配除换行符 \n 之外的任何单字符,*表示零次或多次。所以.*在一起就表示任意字符出现零次或多次。没有?表示贪婪模式。比如a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
又比如模式src=`.*`, 它将会匹配最长的以 src=` 开始,以`结束的最长的字符串。用它来搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 时,将会返回 src=``test.jpg` width=`60px` height=`80px`

2. .*?

?跟在*或者+后边用时,表示懒惰模式。也称非贪婪模式。就是匹配尽可能少的字符。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
又比如模式 src=`.*?`,它将会匹配 src=` 开始,以 ` 结束的尽可能短的字符串。且开始和结束中间可以没有字符,因为*表示零到多个。用它来搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 时,将会返回 src=``

3. .+?

同上,?跟在*或者+后边用时,表示懒惰模式。也称非贪婪模式。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.+?b匹配最短的,以a开始,以b结束的字符串,但a和b中间至少要有一个字符。如果把它应用于ababccaab的话,它会匹配abab(第一到第四个字符)和aab(第七到第九个字符)。注意此时匹配结果不是ab,abaab。因为a和b中间至少要有一个字符。
又比如模式 src=`.+?`,它将会匹配 src=` 开始,以 ` 结束的尽可能短的字符串。且开始和结束中间必须有字符,因为+表示1到多个。用它来搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 时,将会返回 src=``test.jpg`。注意与.*?时的区别,此时不会匹配src=``,因为src=`` 之间至少有一个字符。

4. 示例代码

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.junit.jupiter.api.Test;

public class TestRegx {

 @Test
 public void testRegx(){

  String str = "<img src=``test.jpg` width=`60px` height=`80px`/>";

  String pattern1 = "src=`.*`";
  String pattern2 = "src=`.*?`";
  String pattern3 = "src=`.+?`";

  Pattern p1 = Pattern.compile(pattern1);
  Pattern p2 = Pattern.compile(pattern2);
  Pattern p3 = Pattern.compile(pattern3);

  Matcher m1 = p1.matcher(str);
  Matcher m2 = p2.matcher(str);
  Matcher m3 = p3.matcher(str);

  System.out.println("根据pattern1匹配的结果:");
  if (m1.find()) {
   for(int i=0; i<=m1.groupCount(); i++){
    System.out.println(m1.group(i));
   }
  }

  System.out.println("根据pattern2匹配的结果:");
  if (m2.find()) {
   for(int i=0; i<=m2.groupCount(); i++){
    System.out.println(m2.group(i));
   }
  }

  System.out.println("根据pattern3匹配的结果:");
  if (m3.find()) {
   for(int i=0; i<=m3.groupCount(); i++){
    System.out.println(m3.group(i));
   }
  }

  String[] str1 = p1.split(str);
  String[] str2 = p2.split(str);
  String[] str3 = p3.split(str);

  System.out.println("根据pattern1切分的结果");
  for (int i=0; i< str1.length; i++) {
   System.out.println(str1[i]);
  }

  System.out.println("根据pattern2切分的结果");
  for (int i=0; i< str2.length; i++) {
   System.out.println(str2[i]);
  }

  System.out.println("根据pattern3切分的结果");
  for (int i=0; i< str3.length; i++) {
   System.out.println(str3[i]);
  }
 }
}

5. 示例结果

总结

到此这篇关于解析正则表达式中的.*,.*?,.+?的含义的文章就介绍到这了,更多相关正则表达式.*,.*?,.+?内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 正则表达式匹配各种特殊字符

    写个可以匹配一下各种特殊字符的正则表达式 ((?=[\x21-\x7e]+)[^A-Za-z0-9]) x21-\x7e]+)[^A-Za-z0-9]) 这个匹配所有键盘上可见的非字母和数字的符号 var patrn = /[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%--&*()--\-+={}|<>?:""[].:'',..]/im; if (!patrn.test(str)) {// 如果

  • jmeter设置全局变量与正则表达式提取器过程图解

    接口测试中,很多接口都要带上登录后的token才能正常发送请求,这里记录一下登录获取token设置为全局变量供其他接口使用 登录后返回信息信息中会有一个token值,添加后置处理器中的正则表达式提取token,然后用后置处理器中的BeanShell PostProcessor设置token为全局变量 1.获取token值: 1.1.用fiddler抓包 1.2.F12查看接口信息 1.3.用jmeter登录查看 2.正则表达式提取token: 3.BeanShell PostProcessor设

  • 正则表达式(RegExp)判断文本框中是否包含特殊符号

    前言 有时,我们希望判断文本框中用户输入的字符是否含有特殊符号(*/#$@),就像用户注册时密码框的填写. demo 利用 RegExp 对象,能很优雅的实现以上需求: // even(文本框内容) function (even) { // 规则对象(flag) var flag = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<><>/?~!@#¥--&*()--|{}[]'::""'.,.? ]&

  • python 正则表达式获取字符串中所有的日期和时间

    提取日期前的处理 1.处理文本数据的日期格式统一化 text = "2015年8月31日,衢州元立金属制品有限公司仓储公司(以下简称元立仓储公司)成品仓库发生一起物体打击事故,造成直接经济损失95万元." text1 = "2015/12/28下达行政处罚决定书" text2 = "2015年8月发生一起物体打击事故" # 对文本处理一下 # 2015-8-31 2015-12-28 text = text.replace("年&quo

  • 解析正则表达式中的.*,.*?,.+?的含义

    1. .* . 表示匹配除换行符 \n 之外的任何单字符,*表示零次或多次.所以.*在一起就表示任意字符出现零次或多次.没有?表示贪婪模式.比如a.*b,它将会匹配最长的以a开始,以b结束的字符串.如果用它来搜索aabab的话,它会匹配整个字符串aabab.这被称为贪婪匹配. 又比如模式src=`.*`, 它将会匹配最长的以 src=` 开始,以`结束的最长的字符串.用它来搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 时,将会返回 s

  • 正则表达式中^和$的含义与实例代码

    目录 先说明一下两个表达式含义: 我们在来看下,非开头和结尾的情况 附:在正则表达式中^ 和 $ 同时出现的含义 总结 前前一期说了正则表达式校验金额最多保留两位小数(感兴趣的小伙伴可以过去看看) 其中提到了^和$,当时只是简单说明了这个表达式,今天来详细说明一下使用方法 先说明一下两个表达式含义: ^匹配开始位置 $匹配结束位置 来看个简单的demo import java.util.regex.Pattern; /** * @author yanghao * @version Pattern

  • 全面解析JS字符串和正则表达式中的match、replace、exec等函数

    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 正则表达式由于不经常使用,所以容易经常忘记,下面小编把常用的函数和功能,简明扼要的罗列在此,以备日后查看: RegExp对象的函数常用的有2个 1.test函数 用法:RegExpObject.test(string) 返回:如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回

  • C# 中使用正则表达式匹配字符的含义

    正则表达式 是一种匹配输入文本的模式..Net 框架提供了允许这种匹配的正则表达式引擎.模式由一个或多个字符.运算符和结构组成.接下来通过本文给大家介绍C# 中使用正则表达式匹配字符的含义. 1.正则表达式的作用:用来描述字符串的特征. 2.各个匹配字符的含义: . :表示除\n以外的单个字符 [ ]  :表示在字符数组[]中罗列出来的字符任意取单个 |   :表示"或"的意思 ()  :表示改变优先级或"提取组" *   :限定前面的表达式出现0次或多次 + :限

  • PHP中->和=>的含义及使用示例解析

    在学习PHP中,遇到了->和=>这两个符号. 刚遇到这两个符号的时候不知道它们代表的含义,在经过百度后才发这两个符号的秘密. 下面来看一下在PHP中->的秘密,如下代码. <?php class Car { public $speed = 0; //增加speedUp方法,使speed加10 public function speedUp(){ $this->speed+=10; } } $car = new Car(); $car->speedUp(); echo $

  • 正则表达式中test、exec、match的区别介绍及括号的用法

    test.exec.match的简单区别 1.test test 返回 Boolean,查找对应的字符串中是否存在模式. var str = "1a1b1c"; var reg = new RegExp("1.", ""); alert(reg.test(str)); // true 2.exec exec 查找并返回当前的匹配结果,并以数组的形式返回. var str = "1a1b1c"; var reg = new Re

  • 正则表达式中环视的简单应用示例【基于java】

    本文实例讲述了正则表达式中环视的简单应用.分享给大家供大家参考,具体如下: 由于开发工作需要对文本中内容进行过滤,删除或替换掉一些无用的或不符合要求的信息.于是发现一个问题,某一类工程性文本中,用到很多英文写法相同.但含义不同的单位,需要将其分别转为真实含义对应的汉字.比如:"粘度为17s,移动距离为350厘米,要求混凝土必须内实外光.振捣时间为30s.",很明显第一个s是粘度的单位,第二s是时间单位,现在需要将文本中所有表示时间的s替换为"秒",在朋友指引下,发现

  • 谈谈正则表达式中的句号.

    我们知道,正则表达式中,可以用 . 表示任意单个字符,但在underscore和jquery的源代码中,我们可以看到,这些著名类库的代码中,经常并不是用 . 来表示任意字符,而是使用 [\w\W] 或者[\s\S] .乍一看,好像表达的含义是一样的,可是为什么放着简单的方法不用,而去多绕个圈子?今天就简单说说这个问题. 首先我们必须要正确理解 . 的含义.其实说它表示任意单个字符,可能会让人产生误解,必须要强调一下,这个"任意单个字符"不包括控制换行的字符,也就是不包含 \n \r \

  • Python字符串和正则表达式中的反斜杠('\')问题详解

    在Python普通字符串中 在Python中,我们用'\'来转义某些普通字符,使其成为特殊字符,比如 In [1]: print('abc\ndef') # '\n'具有换行的作用 abc defg In [2]: print('abc\tdef') # '\t'具有制位符的作用 abc defg 我们还可以用'\'来转义特殊字符,使其成为普通字符,比如 In [3]: print('abc\\tdef') # 使'\'成为一个普通的字符,没有转义作用 abc\tdef In [4]: prin

  • 正则表达式中两个反斜杠的匹配规则详解

    关于正则表达式raw的\匹配规则 这是我在学习中获得到的一个例子,第一表达式中匹配到的是none.于是乎我就在思考,为什么会匹配不到,假设\t被转义成一个\t,那么也应该匹配到\tsanle,而不是none. 为了验证这个问题,我做了如下的实验: 那为什么一个会出现这样的结果呢,在正则表达式中,需要查找的字符串,会进行两次转义,先是传入的字符串进行第一层转换,例如:\\t --> \t .然后传到re解析器里进行第二层转换,\t -->tab键.而需要匹配的字符串\\\t -->两个反斜

随机推荐