美文网首页
正则表达式的贪婪模式和非贪婪模式

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

作者: 王小二黑 | 来源:发表于2019-07-17 18:40 被阅读0次

一直听说过正则表达式存在贪婪和非贪婪模式,大概就是最少匹配和最多匹配的区别,看到的例子大多是下面这个例子
源字符串: aabab
贪婪模式串: a.b
非贪婪模式串: a.
?b
贪婪模式结果: aabab
非贪婪模式结果: aab

上面这个例子虽然简单,但是感觉代表性不强,实现今天在解析postgres 逻辑复制的输入时, 刚好碰到一个例子,特来记录下:
输出如下:
table public.t_02: UPDATE: id[integer]:1 name[text]:'name[text]:' create_date[date]:'2020-11-01' bbb[bytea]:null

在通过split之后, 得到待处理的字符串,。
源字符串:name[text]:'name[text]:'
其中name是字段名,text是字符类型, 'name[text]:'是字段的值,现在要通过正则表达式来提取字段名,类型以及字段值。
[]中包含的是类型, :后面的是字段值,因此很自然的想到这个模式串:
^(.*)\[(.*)\]:(.*)$
代码如下:

parttern = `^(.*)\[(.*)\]:(.*)$` 
reg = regexp.MustCompile(parttern)
result = reg.FindStringSubmatch(v)
col := Column{
            Name:  result[1],
            Type:  result[2],
            Value: result[3],
        }

匹配结果分为三组,

1. name[text]:'name
2. text
3. '

完全不是我想要的结果 -_-!!!
出现问题的原因是值里面也出现name[type]:value的模式,所以刚好踩到了贪婪模式的坑。
这里其实golang给了一个迷惑性的说法, regexp.MustCompile是最左、最短匹配, 而regexp.MustCompilePOSIX是最左、最长匹配, 因此,我还以为MustCompile已经是非贪婪匹配了。不过好在golang提供了匹配标志(?U)来表示非贪婪匹配,修改之后的代码如下:

parttern = `^(?U)(.*)\[(.*)\]:(.*)$`  // (?U)非贪婪模式
reg = regexp.MustCompile(parttern)
result = reg.FindStringSubmatch(v)
col := Column{
            Name:  result[1],
            Type:  result[2],
            Value: result[3],
        }

匹配结果:

1. name
2. text
3. 'name[text]:'

相关文章

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

    一、什么是贪婪模式和非贪婪模式? 定义 贪婪模式:正则表达式趋向于匹配最大长度。 非贪婪模式:正则表达式趋向于匹配...

  • JavaScript 正则表达式( 匹配网页的图片地址)

    正则表达式 - 元字符 贪婪模式与非贪婪模式 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为;贪婪模式 在...

  • 正则表达式

    贪婪模式和非贪婪模式 正则表达式是贪婪匹配的。比如:'123456789'.replace(/\d{3,6}/g,...

  • 正则表达式

    1.什么是贪婪模式和非贪婪模式? 量词在默认下是尽可能多的匹配的,就是贪婪模式;非贪婪模式,让正则表达式尽可能少的...

  • 正则表达式

    1.什么是贪婪模式和非贪婪模式? 贪婪模式 一般情况下,正则表达式在匹配过程中会尽可能多的匹配 非贪婪模式 让正则...

  • 爬虫的提取(2)--re正则

    python正则表达式基本元字符 贪婪模式在python中默认采用的是贪婪模式,使用非贪婪模式的话,只需要在量词后...

  • 正则表达式贪婪模式与非贪婪模式

    什么是正则表达式的贪婪模式和非贪婪模式? 我们先从例子入手: 原本想要匹配的字符为"witch"和"broom"两...

  • 贪婪模式和非贪婪模式

    贪婪模式先看那个例子 得到的是[""witch" and her "brom""],而并不是我们之前想到的"wit...

  • 第23章 正则表达式作业

    第1题:什么是贪婪模式和非贪婪模式? 什么是贪婪模式和非贪婪模式? 比如{3,5}这个量词,要是在句子中出现了十次...

  • javascript正则表达式

    什么是贪婪模式和非贪婪模式? 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功...

网友评论

      本文标题:正则表达式的贪婪模式和非贪婪模式

      本文链接:https://www.haomeiwen.com/subject/txpclctx.html