所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

正则表达式常见贪婪词有哪些?举例详解新手一看就会

正则表达式常见贪婪词有哪些?举例详解新手一看就会 一

文章目录CloseOpen

这篇文章就把新手必碰的正则贪婪词扒得明明白白:从最常见的.、.+,到d+、w+这些,每个词到底怎么“贪婪”,用真实场景举例子(比如提取URL中的参数值、截取网页标题),甚至把“贪婪模式”和“非贪婪模式”的区别用对比例子讲透。不用记复杂术语,跟着例子一步步看,你立马能搞懂:原来之前的错误,只是没摸透这些词的“脾气”。下次写正则时,再遇到想精准抓取内容的情况,你再也不用试错半天——对照文章里的例子,直接套就能用,新手也能轻松搞定。

你有没有过这种情况?想从电商后台的订单记录里提取“买家昵称:XX”后面的内容,结果正则把“买家昵称:XX,收货地址:YY,联系电话:ZZ”全吞了?或者想从SEO报告里抓“关键词:正则教程”,结果连后面的“(搜索量:1000)”都一起带进来?其实不是你正则写得差,是没搞懂那些“贪婪词”的脾气——它们天生就爱“吃越多越好”,不掰碎了讲清楚,真的很容易踩坑。我做了5年的互联网数据处理,帮过电商、SEO、新媒体的朋友解决正则问题,至少有80%的问题都是“贪婪匹配”搞的鬼,今天就把最常见的几个贪婪词扒出来,每个都给你举真实例子,保证新手也能看懂。

先搞懂:为什么正则会“贪婪”?

要讲贪婪词,得先明白正则的“贪婪模式”到底是什么——说白话就是:正则默认情况下,能匹配多就绝不匹配少。比如你用“.”,它会从第一个符合条件的位置开始,一直吃到最后一个符合条件的位置才罢休——就像你去吃自助餐,能拿多少拿多少,根本不管你是不是真的需要这么多。

去年我帮一个做小红书运营的朋友处理笔记内容,她想提取笔记里的“产品:XX”后面的产品名,用了“产品:(.)”,结果把“产品:XX,使用感受:超好用,缺点:有点贵”全抓了,气得她来找我吐槽:“正则是不是有bug?”我打开在线工具(Regex101,https://regex101.com/ rel=”nofollow”)帮她测,结果一目了然——“.”从“产品:”后面开始,一直吃到句子的最后一个字符,因为没有明确的结束标志,它就“贪得无厌”。后来我让她改成“产品:(.?),”(注意后面加了逗号,并且把“.”改成非贪婪的“.?”),才终于只抓到“XX”。

其实正则的贪婪模式不是“bug”,反而是“功能”——比如你想匹配整个段落的内容,“.”就能帮你一次性抓完,省得你写一堆复杂的规则。但对于新手来说,这种“默认的方便”反而容易变成“默认的坑”,因为你还没学会“控制”它的贪婪。就像你第一次用智能手机,默认的设置可能不是最适合你的,但你得先搞懂它怎么用,才能调得顺手。

正则里最常见的4个贪婪词,每个都要避坑

搞懂了原理,接下来直接上硬菜——正则里最常见的4个贪婪词,每个我都给你举行业里的真实例子,看完你就能直接套用。

  • 最容易踩坑的“.”:匹配任意字符,吃越多越好
  • “.”是正则里最经典的贪婪词,没有之一——它匹配除了换行符之外的任何字符,而且是尽可能多的匹配。比如你想从网页的meta描述里提取内容,meta标签是“”,你用“content=”(.)””,结果会抓到“正则教程,新手入门必看”,这时候是对的;但如果meta标签里有多个引号(比如“”),“.”就会从第一个“content=””开始,一直吃到最后一个“””,结果抓到“正则教程,”新手入门必看”——这时候就错了,因为中间的引号打断了匹配。

    再比如做SEO优化时,你想从竞争对手的网页里提取H1标题,用“

    (.)

    ”,如果对手的H1标签里没有其他标签(比如“

    正则教程

    ”),没问题;但如果对手的H1标签里有嵌套(比如“

    正则教程 新手必看

    ”),“.”就会抓“正则教程 新手必看”——这时候你如果只想抓纯文本内容,就得换个写法:用“

    ([^<])”(匹配除了“<”之外的所有字符),或者用非贪婪模式“

    (.

    ?)

    ”。不过非贪婪模式也不是万能的,比如如果H1标签里有换行,“.?”可能会提前结束,这时候就得用“[sS]?”(匹配所有字符,包括换行)。

  • “.+”:匹配1个以上任意字符,比“.”少了空字符
  • “.+”和“.”很像,但它有个“小脾气”——不匹配空字符。也就是说,它必须至少匹配1个字符,不能“吃空气”。比如你想从用户评论里提取“评分:XX分”,用“评分:(.+)分”,如果评论是“评分:5分,推荐”,“.+”会抓“5”,没问题;但如果评论是“评分:5分-10分”,你用同样的正则,“.+”会抓“5分-10”——因为它要吃到最后一个“分”前面的位置,这时候就错了。

    这时候该怎么办?教你个笨办法:给“.+”加个“?”变成非贪婪模式,也就是“评分:(.+?)分”。这样它就会从“评分:”后面开始,吃到第一个“分”就停,结果就是“5”,刚好是你要的。再比如做电商客服,你想从聊天记录里提取“订单号:XX”,用“订单号:(.+)”,如果聊天记录是“订单号:OD123456,麻烦查一下”,“.+”会抓“OD123456,麻烦查一下”——这时候你就得给它加个结束标志,比如“订单号:(.+?),”(用逗号当结束符),这样才会只抓“OD123456”。

  • “d+”:匹配1个以上数字,抓数字的“贪心鬼”
  • “d+”是抓数字的一把好手,但它的“贪婪”也很让人头疼——只要是数字,能抓多少抓多少。比如你想从物流信息里提取快递单号,物流信息是“快递单号:123456789012”,用“快递单号:(d+)”,会抓到“123456789012”,没问题;但如果物流信息是“快递单号:123456789012-789”,你用同样的正则,“d+”会抓“123456789012”——因为“-”不是数字,它会在“-”前面停下来,这时候是对的。

    但如果是“价格:199.99元”,你用“价格:(d+).(d+)”,会抓到“199”和“99”,刚好是整数和小数部分;可如果是“价格:199元-299元”,你用“价格:(d+)-(d+)”,会抓到“199”和“299”,也没问题。不过这里有个小技巧:如果你知道数字的位数(比如快递单号是12位),就别用“d+”,直接用“d{12}”——这样既不会多抓也不会少抓,比“贪心鬼”靠谱多了。

  • “w+”:匹配字母/数字/下划线,抓“合法字符”的能手
  • “w+”的“胃口”比较“挑”——只吃字母、数字、下划线,其他字符(比如横杠、空格、中文)都不吃。比如你想从数据库里提取“用户名:zhangsan_123”,用“用户名:(w+)”,会抓到“zhangsan_123”,没问题;但如果用户名是“zhangsan-123”(有横杠),“w+”就会在横杠那里停下来,只抓“zhangsan”——这时候你就得“扩展它的胃口”,用“[w-]+”(匹配字母、数字、下划线、横杠),这样才能抓到完整的“zhangsan-123”。

    再比如做新媒体运营,你想从文章里提取“@用户名”,用“@(w+)”,如果用户名是“@zhangsan_123”,会抓到“zhangsan_123”;但如果用户名是“@zhangsan-123”,就会只抓“zhangsan”——这时候你就得改成“@([w-]+)”。不过要注意,“[w-]+”里的“-”要放在括号的 不然会被当成“范围符”(比如“[a-z]”是匹配a到z的字母),容易出错。

    为了让你更直观,我把这4个贪婪词的关键信息做成了表格,一眼就能看清它们的“脾气”:

    贪婪词 含义 贪婪表现 避坑技巧
    . 匹配任意字符(除换行) 从第一个位置吃到最后一个位置 改用.?或限定范围(如[^”]匹配非引号字符)
    .+ 匹配1个以上任意字符 不匹配空,但仍会吃太多 用.+?或限定字符类型(如d+匹配数字)
    d+ 匹配1个以上数字 尽可能多的抓数字 明确数字位数(如d{12})或用边界(如bd+b)
    w+ 匹配字母/数字/下划线 抓完所有符合的字符 如果有特殊字符,用[]扩展范围(如[w-]+)

    其实正则的贪婪并不可怕,只要你记住一个原则:给正则“画条线”——明确你要匹配的内容“从哪开始”“到哪结束”,它就不敢乱吃东西了。比如你想从“销售额:123,456元”里提取数字,就别用“销售额:(d+)”,改用“销售额:([d,]+)”(匹配数字和逗号),再把逗号去掉就行;再比如你想抓“评论:五星好评”,就用“评论:(.+?)(”(用括号当结束标志),这样就不会把后面的“(物流很慢)”带进来。

    最后再给你个新手必看的小技巧:写完正则一定要测试!用在线工具(比如Regex101,https://regex101.com/ rel=”nofollow”)输入你的测试文本,看匹配结果是不是你要的——如果结果太长,十有八九是贪婪在搞鬼;如果结果太短,就是范围限太死了。我当年学正则的时候,光是测试就花了半个月,现在闭着眼都能猜出“贪婪词”在哪搞事。

    你有没有遇到过正则贪婪的坑?比如抓数据的时候把无关内容带进来?或者改了半天还是不对?欢迎在评论区告诉我,我帮你看看怎么改——毕竟我踩过的坑真的不少,说不定能帮你省点时间。


    本文常见问题(FAQ)

    正则里的“贪婪模式”到底是什么意思?

    说白话就是正则默认的“吃越多越好”脾气——能匹配多少字符就尽量匹配多少,像你去自助餐拿菜,能堆满满一盘就绝不只拿一点。比如用“.”匹配内容,它会从第一个符合条件的位置开始,一直吃到最后一个符合条件的位置才停,比如你想抓“买家昵称:XX”后面的内容,它能把“买家昵称:XX,收货地址:YY”全吞了,就是因为这个模式在起作用。

    其实这不是bug,是正则的默认功能,比如你想抓整个段落的内容,“.”就很方便,但新手没搞懂的时候,反而容易被这个“方便”坑到。

    正则里最常见的贪婪词有哪些?

    最常让新手踩坑的主要是四个:第一个是“.”,匹配除换行外的任意字符;第二个是“.+”,匹配1个以上的任意字符(比“.”少了空字符的情况);第三个是“d+”,专门匹配1个以上的数字;第四个是“w+”,匹配字母、数字或下划线这些“合法字符”。

    这四个词的共性就是“能抓多少抓多少”,比如“d+”抓快递单号时,会把12位数字全抓了,但如果有“-”分隔,它会在“-”前停,要是你没注意,就容易漏后面的内容。

    怎么避免正则“贪婪”把无关内容带进来?

    核心原则就是“给正则画条线”——明确你要的内容“从哪开始”“到哪结束”。比如想抓“买家昵称:XX”后面的内容,就别用“买家昵称:(.)”,改用“买家昵称:(.?),”(加个逗号当结束标志),或者用非贪婪模式(在贪婪词后面加“?”,比如“.?”);要是抓数字,知道位数的话就用“d{12}”代替“d+”,这样不会多抓也不会少抓。

    还有个技巧是“限定范围”,比如不想让匹配包含引号,就用“[^”]”(匹配除了引号外的所有字符),这样就算中间有引号,也不会被吞进去。

    非贪婪模式(比如.?)是不是能解决所有贪婪问题?

    不是哦,非贪婪模式是“能匹配少就绝不匹配多”,但它也有局限性。比如如果匹配的内容里有换行,“.?”可能会提前结束,因为默认不匹配换行;再比如你想抓H1标签里的内容,用“

    (.

    ?)”,如果H1里有嵌套的标签没问题,但如果有换行,可能就抓不全了,这时候得用“[sS]?”(匹配所有字符包括换行)才行。

    所以非贪婪模式是工具,但得结合具体场景用,不能一刀切。

    写完正则怎么测试是不是“贪婪”在搞鬼?

    一定要用在线工具测!比如Regex101,把你的正则和测试文本输进去,看匹配结果——如果结果比你想要的长很多,十有八九是贪婪在搞事;如果结果太短,就是你把范围限得太死了。

    我当年学正则的时候,每天都用这个工具测,比如帮朋友抓小红书笔记里的产品名,测一遍就知道“.”是不是吞了太多内容,改改非贪婪模式或者加个结束标志,结果就对了。

    原文链接:https://www.mayiym.com/55395.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码