正则表达式之匹配替换

最近做word脚注用到了正则表达式的匹配替换功能。我提取rtf字符串中书签的名称,更改名称后,再替换到字符串中。看代码:

 1                var range = fd_Field.Result.Footnotes[1].Range;
18                str_Content = Regex.Replace(str_Content, @"\\bkmk(start|end) _(\w+)}", "\\bkmk$1 _$2_" + fid + "}", RegexOptions.Multiline);
19
20                 PasteByClipboard(range, str_Content);
21
22                 var maches=Regex.Matches(str_Content, @"\\bkmkstart _(\w+)}", RegexOptions.Multiline);
23
24                 for (int i = 1; i <= range.Paragraphs.Count; i++)
25                 {
26                     if (maches.Count > 0)
27                     {
28                         if (maches[i - 1].Success)
29                         {
30
31                             if (maches[i - 1].Groups.Count > 0)
32                             {
33                                 range.Paragraphs[i].ID = maches[i - 1].Groups[1].Value;
34                             }
35                         }
36                     }
37                 }

代码解释:str_Content中存储的是rtf格式的字符串,字符串中有word书签的定义,\v\bkmkstart _nf8f0c1a4cb18b4a8cae0338d4923c5cc1} 这是书签的开始位置,\v\bkmkend _nf8f0c1a4cb18b4a8cae0338d4923c5cc1}\par}, 这是书签的结束位置。\v表示书签的名称是隐藏的。第18行的黄色部分是正则表达式,绿色部分是要替换的内容,正则匹配书签开始和结束的名称,然后修改名称并替换。(\w+)匹配的是红色背景的部分。圆括号是正则表达式中的分组捕获。再看看替换的部分,\\bkmk$1 _$2_" + fid + "},$1引用第一个捕获分组,$2引用第二个捕获分组。fid是程序中的一个变量,表示域Id,这是一个string类型,它从域的Id变化而来。

从程序的第22行开始到结束,用正则  \\bkmkstart _(\w+)} 匹配修改后的书签名称,并把它作为rtf段落的Id值。这一段展示了程序如何读取分组捕获的值。Groups[0],存放的是整个正则匹配的结果,Groups[1],存放的是第一个分组匹配的结果。因此要取分组匹配的结果,从1开始。

正则的分组匹配替换功能的强大是毋庸置疑的,它使得程序变得简洁,但是仍然能满足我们各种需求。任何一种强大的技术好比一把锋利的剑,用好了事半功倍,用不好了,后患无穷。例如,我要用正则匹配连续的自然数。1,3,4,5,8 ,比如我要捕获3,4,5,用正则该怎么写呢?研究了半天,觉得无从下手,反而用程序实现起来简单的多。碰到字符串的处理,一些比较复杂的处理,首先想想正则能不能排上用场。学以致用,这是我学习技术的最大的快乐。

时间: 2024-08-05 08:47:47

正则表达式之匹配替换的相关文章

idea 使用正则表达式 进行匹配替换

关于正则表达式 可以参考相应的笔记 另外 如果要提取正则表达式中匹配到的内容,使用$1 - $... 按顺序取(第一个表达式 到 第N个表达式匹配到的数据),  这点和linux正则获取的方式是一样的

Javascript正则表达式匹配替换

根据正则表达式的匹配结果将匹配项替换为*function regReplace(reg, str){ var result, //最终输出结果 out, //每次运行正则exec返回的匹配结果. index, //匹配项在字符串中位置 length; //匹配项长度 result = str.split(""); //将待匹配的字符串分开成数组,等待处理 while(out = reg.exec(str)){ //当匹配成功返回out数组,如果没有匹配项或达到字符串末尾返回null l

Vim正则表达式匹配替换字符串

/********************************************************************** * Vim正则表达式匹配替换字符串 * 说明: * 用Vim用了几年了,平时也就替换字符串比较多,很少用正则表达式替换, * 今天在修改HTML文档的时候,不想一个一个去替换. * * 2018-6-1 深圳 宝安西乡 曾剑锋 ****************************************************************

JS 正则表达式否定匹配(正向前瞻)

引言:JS 正则表达式是 JS 学习过程中的一大难点,繁杂的匹配模式足以让人头大,不过其复杂性和其学习难度也赋予了它强大的功能.文章从 JS 正则表达式的正向前瞻说起,实现否定匹配的案例.本文适合有一定 JS 正则表达式基础的同学,如果对正则表达式并不了解,还需先学习基础再来观摩这门否定大法. 一.标签过滤需求 不知道大家在写JS有没有遇到过这样的情况,当你要处理一串字符串时,需要写一个正则表达式来匹配当中不是 XXX 的文本内容.听起来好像略有些奇怪,匹配不是 XXX 的内容,不是 XXX 我

使用正则表达式进行匹配

使用正则表达式的目的是为了实现比字符串处理函数更加灵活的处理方式,因此跟字符串处理函数一样,其主要用来判断子字符串是否存在.字符串替换.分割字符串.获取模式子串等. PHP使用PCRE库函数来进行正则处理,通过设定好模式,然后调用相关的处理函数来取得匹配结果. preg_match用来执行一个匹配,可以简单的用来判断模式是否匹配成功,或者取得一个匹配结果,他的返回值是匹配成功的次数0或者1,在匹配到1次以后就会停止搜索. $subject = "abcdef"; $pattern =

在VS中用正则表达式查找或替换

Example: 查找#incldue中带有gl开头的头文件的,用include.+<gl.+或include.+<gl.+ VS2005中的[查找/替换]拥有强大的正则匹配功能 eg.          DBAssist.ToInt32(p_dtrSource["QCBATCH_SEQ_INT"])          转换成       p_dtrSource["QCBATCH_SEQ_INT"].ToString() 只需要在查找/替换中[记得选中查

javascript正则表达式:匹配所有html标签

在面试的过程中遇到一个这样的题目: 比如有一段HTML字符串: var string='<div class"test">Test a code</div><em>I am a girl.</em>'; 要求写一个匹配HTML 标签的正则表达式,并且替换掉所有的标签. html标签有<h1></h1>这种成对的,也有<br/>这种自闭合的,更多的是<img style=”….” width=”22

notepad++使用正则表达式的查找替换

使用正则表达式可以很好地完成很多繁琐耗时的工作,以下抄录editplus正则表达式的使用,同样适用于notepad++:表达式 说明\t 制表符.\n 新行.. 匹配任意字符.| 匹配表达式左边和右边的字符. 例如, "ab|bc" 匹配 "ab" 或者 "bc".[] 匹配列表之中的任何单个字符. 例如, "[ab]" 匹配 "a" 或者 "b". "[0-9]"

ruby正则表达以及匹配替换

ruby正则表达式分两种,一种是转义的,一种是不转义的,不转义的我还没用过,所以不知道效果怎么样,这里只讲讲转义的,大体来讲,所有的表达式都被包含在两个/中间,中括号[]内的代表或,就是任意一个,单个字符匹配使用的是\?(?代表要匹配的特殊字符,比如我要匹配右中括号,那么我就可以写\])恩,基本上就这样,下面给出具体范例: /a/ :匹配字符a /[Aa]b/:匹配字符Ab或者ab /\s/匹配所有的空白,比如空格.换行.tab键 /\n/匹配新的一行 /\r/匹配换行,相当于enter键,注: