网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月03日漏签0天
c#吧 关注:188,412贴子:822,798
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 9回复贴,共1页
<<返回c#吧
>0< 加载中...

再聊_正则表达式

  • 只看楼主
  • 收藏

  • 回复
  • vivi1share
  • c#小菜鸟
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一楼喂度娘


  • vivi1share
  • c#小菜鸟
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
今天我们只聊一个话题: 零宽断言
首先 零宽断言怎么解释拗口的词语呢, 这个词要分开来理解才行
零宽, 就是零的宽度,也就是没有宽度, 匹配一个没有宽度的“字符”,是不是难以想象?
别急,如果有一天,客户需要在所有的'AC'字符中插入一个字符'O'变成'AOC',这时零宽就可以发挥作用啦。 你脑中的方法是:把前面是A而后面是C的 “零宽” 替换为O, 不就完成了吗!
正确!,于是你觉得零宽真有用。


2025-07-03 12:49:09
广告
  • vivi1share
  • c#小菜鸟
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这时候你灵光一闪
AC 变成 AOC 那我查找 AC 替换成AOC 不就成了吗?
正确, 于是这时候你觉得零宽是多余的, 没有任何作用。


  • vivi1share
  • c#小菜鸟
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
客户的需求变了
要把 AACC 换成 AAOCC
要把 BBCC 换成 BBOCC
要把 DDFF 换成 DDOFF
等等,等等
意思凡是遇到 前面两个相同字符,后面两个相同字符,则中间插入一个O
这时候简单的查找替换用不上了, 想想该怎么办呢?


  • vivi1share
  • c#小菜鸟
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这时候零宽再度出场
断言也跟着来了
为什么呢,因为他们俩密不可分,
断言是什么意思呢? 其实就是条件
用来断言: 零宽前面是什么什么, 零宽后面是什么什么 定义符合这么个条件的零宽!


  • vivi1share
  • c#小菜鸟
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
需求是:前面两个相同字符,后面两个相同字符,则中间插入一个O
利用零宽断言 正则表达式是:将 (?=(\w)\1)(?<=\2(\w)) 替换成 O
一试,成功,于是,你又开始觉得零宽断言挺有用的
解释(?=) 指正向肯定 (?<=) 指反向肯定
这条正则表达式合起来的意思是, 查询条件为:前面两个字符相同,后面两个字符相同的 零宽


  • vivi1share
  • c#小菜鸟
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你很机灵, 你突然又想到了,下面的正则表达式
(\w)\1(\w)\2 也能查找出来前面两个字符相同的后面两个字符相同的匹配
于是你把这个匹配替换成$1$1O$2$2 一样完成了任务
这时候,你开始又觉得零宽断言 似乎没什么作用了。


  • vivi1share
  • c#小菜鸟
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一个客户需求飞来:
把文档中所有的数字,每三个一组,用逗号分隔开来
比如:1234567890 要变成 1,234,567,890
这时候你只有傻眼了。难道要全文搜索数字,然后一个一个改吗?
真可怕!


2025-07-03 12:43:09
广告
  • vivi1share
  • c#小菜鸟
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
(?<=\d)(?=(\d\d\d)+\D)
这个正则表达式的通俗解释是:
把前面是数字,后面是三个数字的整数倍的 零宽
查找出来
把这些零宽替换为 逗号!
就这么简单, 问题轻松解决了!


  • vivi1share
  • c#小菜鸟
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
再来看一个零宽断言: 正向否定零宽断言
查找四位不重复的数字
(?!\d*(\d)\d*\1)\d{4}
匹配四位不重复的数字 7654 6413 2135
不匹配 9898 7798 7987 8292
我们先看 \d*(\d)\d*\1 代表的意思是: 有重复的数字,
一旦被否定了(?! ), 意思就是无重复的数字
这个正则表达式通俗解释是
(后面的数字是没有重复的零宽) 和 (后面的4个数字) 一并匹配出来。
如此而已,您理解了吗?


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 9回复贴,共1页
<<返回c#吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示