如题,将 {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# 正则表达式替换制定关键词后面的所有内容的更多相关文章

  1. 在notepad++里面使用正则表达式替换掉所有行逗号前面内容

    需求:在notepad++里面使用正则表达式替换掉所有行逗号前面内容,一文本内容如下(只贴一小部分,实际上N多): 级别,層級程序,程式插件,外掛程式鼠标,滑鼠打印,列印打开,開啟博客,部落格联系,聯 ...

  2. editplus-使用正则表达式替换每行首字母和尾字母

    打开EditPlus,输入多行数据,快捷键ctrl+h 打开替换窗口,选择“正则表达式”替换 行首批量添加   查找"^" 替换为“我是行首aaa” 行尾批量添加   查找&quo ...

  3. Notepad++快捷键&正则表达式替换字符串&插件

    Notepad++绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad++默认的快捷键做个整理(其中有颜色的为常用招数): 1. 文件 ...

  4. 关于在Eclipse中使用正则表达式替换的一点记录(使用正则表达式的分组)

    今天在工作中遇到了点替换的麻烦事,由于数据类进行了变动,具体情况是这样的,需要将下面的代码: player.skillData[i].name 替换为: player.skillData.getSki ...

  5. notepad++正则表达式替换字符串详解

    正则表达式是一个查询的字符串,它包含一般的字符和一些特殊的字符,特殊字符可以扩展查找字符串的能力,正则表达式在查找和替换字符串的作用不可忽视,它 能很好提高工作效率. EditPlus的查找,替换,文 ...

  6. 使用Dreamweaver正则表达式替换href中的内容

    在Dreamweaver中使用正则表达式替换href中的内容,就像下面这些href中的内容复杂多样的情况下,href="/html/u.html",href="/tuho ...

  7. dedecms文档长尾关键词,根据频率先替换长尾关键词再替换主关键词

    问题:在使用dedecms的文档关键词替换功能时,会造成交叉替换 如: 长尾关键词1:男人喝金丝皇菊有什么好处? 长尾关键词2:喝金丝皇菊有什么好处? 主关键词3:金丝皇菊 使用系统默认的功能时,在替 ...

  8. java replaceall 使用正则表达式替换单等号,不替换其他相关的等号。

    写项目需要将公式配置到数据库中,取出后根据公式规则进行比较,由于公式的等于是用单等号,在java中无法直接使用,故需要将单等号替换成双等号,单又不能影响大于等于以及其他形式.故果断选择正则表达式替换. ...

  9. JS 利用正则表达式替换字符串

    JS 利用正则表达式替换字符串 博客分类: JavaScript 学习资料 Java代码 收藏代码 JS 利用正则表达式替换字符串 var data = "123123,213,12312, ...

随机推荐

  1. 关于 js 中的回调函数 callback

    本文写于1年前 曾经的学习文章如今拿出来分享 前言 其实我一直很困惑关于js中的callback,困惑的原因是,学习中这块看的资料少,但是平时又经常见,偶尔复制一下前人代码,功能实现了也就不再去追其原 ...

  2. Traefik的TLS配置

    生产环境的部署大多采用F5+ Traefik这种方式,因为Traefik的SSL方式相对来说比较慢,因此SSL更多的在F5上开放,而F5到Traefik之间以及后端都是http方式. 但客户需要在开发 ...

  3. 某公司java面试经历

    为什么说某公司.由于确实面完了最后挂了回来也没记住公司叫啥名字.是老乡兼好友内推去的小公司,名字有点长,所以也没记住. 公司确实太小,所说是外包公司.然后面回来后跟ACM的前学长说了,他们仅仅说所以不 ...

  4. C/C++ 宏定义中#、##、#@的区别

    #表示:对应变量字符串化 ##表示:把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符 连接符#@:它将单字符标记符变换为单字符,即加单引号.例如: #define B(x) #@x ...

  5. Screen多视窗远程控制管理服务

    Screen是一款由GNU开源计划开发的多视窗远程控制管理服务,简单来说就是为了解决上述情况中网络异常中断或同时控制多个远程窗口而设计的程序. Screen服务程序不仅能够解决上述问题,而且用户在使用 ...

  6. MVC与MVT

    MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 m表示model,主要用于对数据库层的封装 v表示 ...

  7. solr 自聚类实现

    参考官网:https://lucene.apache.org/solr/guide/6_6/result-clustering.html 最近用到solr自聚类的,先简单介绍如下: 1.配置文件 主要 ...

  8. Sense编辑器(Sense Editor)

    Sense编辑器(Sense Editor) 学习了:https://blog.csdn.net/AbnerGong/article/details/50776605 Sense是一个方便的控制台,用 ...

  9. Java中常用的6种排序算法详细分解

    排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过 ...

  10. 浅析php中抽象类和接口的概念以及区别[转]

    //抽象类的定义: abstract class ku{ //定义一个抽象类 abstract function kx(); ...... } function aa extends ku{ //实现 ...