C# 正则表达式替换制定关键词后面的所有内容
如题,将 {OUTSCIPTE} 关键词后的所有内容替换为string.Empty(包含关键字)
这个正则该怎么写?
我是 {OUTSCIPTE}(.*)$ 写的但是什么反应也没有
string str=Regex.Replace("字符串",@"(?<=\{OUTSCIPTE\})[\s\S]*$","");
不错的文章对零宽断言很好的理解与解释了
分组
我们在前面有用大括号{}来指定单个字母出现多少次,比如w{3}表示w连续出现三次.那如果是一串字符的话怎么整呢.我们会联想到算术符号里面的优先级问题,比如乘除号比加减号优先级高.要想使加减号先执行操作可以用个小括号把它们括起来.那在这儿同样把一串字符括起来就行.
比如(arwen){3}表示字符arwen重复三次. (ab[cde]*){4}表示ab[cde]*重复4次.反正用个()括起来后里面就被当作一个单元,一个整体了.专业点说法就叫分组
另外貌似用$加一个数字可以引用前面的分组.例如
string str = @"123abc";
string str = Regex.Replace(str,@(\d+)\w+, @"$1+456"); \\结果是123+456
(\d+)是匹配了123并把它做为一个组,$1就是引用了这个组
后向引用
后向引用,这名字听起来别扭,其实简单点讲就是在后面的匹配中又用到前面的某个分组.那如果在后面某个地方的匹配中要再次用到那个分组咋整呢?简单点的简单的做法把那个分组再照写下就得了呗.
比如(arwen){2}123abc(arwen){3}.但这样看起来有点冗余,于是就整个偷懒的办法出来.给每个分组起个名字,直接用组名来表示那个分组.如果你不直接命名会默认按分组从左到右出现的顺序命名为1,2,3...比如上面的例子最先出现的(arwen)命名为1,再出现个(arwen)命名为2,假如后面还来个(james)那命名为3
有个分组的名字后,上面的例子可以简写为(arwen){2}abc\1{3}引用分组的格式是一个斜杠\加组名
你还可以自己显式为每个组起个名字,格式是(?<name>exp)或者(?'name'exp)其中name是分组的名字,exp是分组中的内容.?就只是标识符而已.假如我要给分组(arwen)取名为a的话就这样写(?<a>arwen)这样开头的例子又可以写为(arwen){2}\a{3}
除了给分组默认取名或显式取名外还可以不给它取名格式是(?:exp)比如把分组(arwen)改成(?:arwen)就表示这个分组没名字.你后面不能通过某个名字去引用它.那这样做有什么意义呢?因为除这在这里我们看到分组名有用外,当通过Regex.Match(string source,string pattern)这个函数匹配取得结果后还可以做更详细的一些分析,那时也会用到分组名的.如果你想忽略掉某个位置的分组信息就可以显式的指定分组没有名字.
零宽断言
我们前面的一些简单匹配,都是先知道要匹配的子字符的一些信息,然后用些元字符和限制字符来表示它.进而匹配出结果.这是直接的匹配方式.还可以通过一些间接的匹配信息,比如知道子字符串前面有啥字符,屁股后面跟着些啥字符来匹配.
于是出现了零宽断言这个怪怪的名词,其实它代表的意思是这样,零宽表示那个表达式不占用地方,宽度为0,比如前面说的^$匹字符串的开头或结尾.它不占用地方,只表示开头或结尾这样一个位置概念.至于断言嘛是逻辑理论里面的一个说法.简单的说就是做判断了,下结论了.
零宽度正预测先行断言(?=exp) 它表示某个字符串背后跟着字符串exp比如.*(?=fool)表示某个字符以fool结尾.如果有字符you are afool.则匹配到的子字符是you are a
零宽度正回顾后发断言(?<=exp) 它表示某个字符串前面有字符串exp比如(?<=fuck)表示某个字符串前面有fuck.如果有字符fuck you则匹配的结果是 you
有了有通过前面或后面有某个字符串来判断,自然就可以有通过前面或后面没有啥字符来判断.这也是相反的意思.表示方法也差不多,只是=号变!
零宽度负预测先行断言 (?!exp) 它表示某个字符串后面没有跟着exp比如hao(?!\d)表示字符hao后面没紧跟着数字,如果有字符hao123,则不能匹配.如果是字符hao 123则匹配到hao
零宽度负回顾后发断言 (?<!exp)它表示某个字符串前面没有exp比如(?<!\d)hao表示字符串hao前没有数字.如果有字符123hao则匹配失败.如果是字符123 hao则匹配到hao
其实像啥零度断言这 类术语太让人纠结了,你干脆别去管他好了.就直接想象成前面有,后面有,前面没有,后面没有这样的通俗易懂的词好了
贪婪与懒惰
我们知道由于匹配的条件往往很模糊,所以匹配到的结果可以是不同的,比如有字符anrwen,用a.*n去匹配.那an和anrwen都是符合条件的结果
一匹配到an就不再匹配下去了,自然是很懒的做法,所以叫懒惰匹配.具体意思就是说尽可能匹配短的字符
而相反的情况就是贪婪匹配,尽可能匹配多的字符
默认的做法是贪婪匹配.所以上面的例子匹配的结果是anrwen
如果我们想得到an的结果,则要这样写a.*?n 多加个问号
至于这个?号在什么情况下用呢,自然是有出现让某个字符重复多次的限定符出现时用
比如* + ? {n}这些符号出现时就可以用,变成*? +? {n}?
C# 正则表达式替换制定关键词后面的所有内容的更多相关文章
- 在notepad++里面使用正则表达式替换掉所有行逗号前面内容
需求:在notepad++里面使用正则表达式替换掉所有行逗号前面内容,一文本内容如下(只贴一小部分,实际上N多): 级别,層級程序,程式插件,外掛程式鼠标,滑鼠打印,列印打开,開啟博客,部落格联系,聯 ...
- editplus-使用正则表达式替换每行首字母和尾字母
打开EditPlus,输入多行数据,快捷键ctrl+h 打开替换窗口,选择“正则表达式”替换 行首批量添加 查找"^" 替换为“我是行首aaa” 行尾批量添加 查找&quo ...
- Notepad++快捷键&正则表达式替换字符串&插件
Notepad++绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad++默认的快捷键做个整理(其中有颜色的为常用招数): 1. 文件 ...
- 关于在Eclipse中使用正则表达式替换的一点记录(使用正则表达式的分组)
今天在工作中遇到了点替换的麻烦事,由于数据类进行了变动,具体情况是这样的,需要将下面的代码: player.skillData[i].name 替换为: player.skillData.getSki ...
- notepad++正则表达式替换字符串详解
正则表达式是一个查询的字符串,它包含一般的字符和一些特殊的字符,特殊字符可以扩展查找字符串的能力,正则表达式在查找和替换字符串的作用不可忽视,它 能很好提高工作效率. EditPlus的查找,替换,文 ...
- 使用Dreamweaver正则表达式替换href中的内容
在Dreamweaver中使用正则表达式替换href中的内容,就像下面这些href中的内容复杂多样的情况下,href="/html/u.html",href="/tuho ...
- dedecms文档长尾关键词,根据频率先替换长尾关键词再替换主关键词
问题:在使用dedecms的文档关键词替换功能时,会造成交叉替换 如: 长尾关键词1:男人喝金丝皇菊有什么好处? 长尾关键词2:喝金丝皇菊有什么好处? 主关键词3:金丝皇菊 使用系统默认的功能时,在替 ...
- java replaceall 使用正则表达式替换单等号,不替换其他相关的等号。
写项目需要将公式配置到数据库中,取出后根据公式规则进行比较,由于公式的等于是用单等号,在java中无法直接使用,故需要将单等号替换成双等号,单又不能影响大于等于以及其他形式.故果断选择正则表达式替换. ...
- JS 利用正则表达式替换字符串
JS 利用正则表达式替换字符串 博客分类: JavaScript 学习资料 Java代码 收藏代码 JS 利用正则表达式替换字符串 var data = "123123,213,12312, ...
随机推荐
- zk常见面试题
一个客户端修改了某个节点的数据,其它客户端能够马上获取到这个最新数据吗 ZooKeeper不能确保任何客户端能够获取(即Read Request)到一样的数据,除非客户端自己要求:方法是客户端在获取数 ...
- 初始加载时edittext不自动获取焦点的方法
在做一个搜索功能时,刚进入界面,edittext直接自动获取焦点,这显然不是我想要的. 那么问题来了:如何关闭EditText自动获取焦点的? 尝试了好几个方法,在Java代码添加focus控制,在x ...
- Java Excel 插入图片
在POI中有HSSFPatriarch对象,该对象为画图的顶级管理器,它的createPicture(anchor, pictureIndex)方法就能够在Excel插入一张图片.所以要在Excel中 ...
- easyui-combobox绑定回车事件注意事项
回车事件的定义的位置必须是easyui-combobox数据加载的后面,才有效果. HTML文件: <select id="aucBrandNo" class="e ...
- asp.net <%%> <%#%><%=%><%@%><%$%>用法区别
asp.net <%%>&<%#%>&<%=%>&<%@%>&<%$%>用法区别 1.<% %> ...
- 机器学习:K-近邻算法(KNN)
机器学习:K-近邻算法(KNN) 一.KNN算法概述 KNN作为一种有监督分类算法,是最简单的机器学习算法之一,顾名思义,其算法主体思想就是根据距离相近的邻居类别,来判定自己的所属类别.算法的前提是需 ...
- 项目部署问题:xftp无法连接服务器、Nginx403 Forbidden解决、nginx反向代理解决前端跨域问题
一.xftp无法连接服务器 在xftp中配置正确的ip,用户名和密码后,居然无法连接 解决方案:将协议里面的FTP换成SFTP,注意换成SFTP后端口就默认换成22,要还是原来的21就还是连不上的哈 ...
- HttpServletRequest和HttpServletResponse详解
请求与响应相关的类和接口非常多,下表是主要的与请求和接口相关的类以及接口. 主要的与请求和接口相关的类及接口 方 法 说 明 ServletInputStream Servlet的输入流 ...
- C调用栈重温
C栈的地址是从高位地址不断忘低位地址膨胀的,最先调用的函数所处的栈地址最高,后被调用的地址在低位: A->H这些地址表明了表明了基本的调用关系,AB是函数入参,CD是函数内的变量. 先调用者在高 ...
- VS2013编译boost1.55库
1. 官网下载最新的Boost库,我的是1.55 2. 在使用vs2013编译boost-1.55.0之前,先要给boost做下修改: boost_1_55_0\boost\intrusive\det ...