正则表明式

C# 丰盛、修改和删除PDF书签

 正则表达式

突发性大家在翻阅PDF文书档案时会遭逢这么一种情景:PDF文档页数相比多,不过又尚未书签,所以我们无法遵照书签火速领会文书档案所教师的始末,也无法点击书签快捷跳转到相应的地点,而不得不一页一页的开卷,至极烦恼。相信开发职员在付出和PDF有关的应用程序时,也会有那般的职能需要,因而在那篇小说中本人就介绍一下哪些利用编制程序的主意(C#)和Spire.PDF组件给PDF文书档案添加书签(包蕴添加书签到现有文书档案和添加子书签),以及修改和删除现有PDF文档中的钦定书签。

概念: 正则表明式是一种处理公事的工具,和任何工具一样,是人们为了化解某一类专门难点而发明的。正则表明式是正则表达式语言创建的,一些用来合作和处理公事的字符串。

 

作用: 正则表明式的效应至关重假诺用以文书同盟和替换

Spire.PDF组件概述


 

 匹配

Spire.PDF是八个正经的PDF组件,用于在.NET应用程序中开创,编辑,处理和读书PDF文书档案。协助添加的PDF文书档案处理操作,如PDF文书档案合并/拆分、转换(如HTML转PDF,PDF转图片等)、打字与印刷(包涵静默打字与印刷)、压缩、添加/修改/删除书签、添加注释、安全设置(包含数字签名)、创立与填充域、图片插入与提取、文本提取与高亮等。它不依赖Adobe
Acrobat,因而运维条件无需安装Adobe
Reader或别的类似组件。 该器件分为商业版和免费版(不是试用版)二种,一般个人使用或然操作的PDF文书档案不当先10页时,能够应用免费版。

一:匹配单个字符串

关于它的安装,有很四种水渠,包蕴官网以及开发者最欢乐和常用的NuGet情势。在Visual
Studio的 NuGet Package Manager
Console中输入以下PowerShell命令回车,组件的dll就会活动地引用到品种中: 

① 、匹配纯文本。

PM> Install-Package Spire.PDF

  纯文本正则表明式匹配原始文本内对应字符。

 

如下边文本输入Ben。

累加、修改和删除PDF书签的兑现

hello,my name is Ben.

壹 、添加书签

匹配出来的结果正是:Ben

1.1 添加书签

 

在Spire.PDF中,每一个PDF文书档案都有八个书签列表(PdfBookmarkCollection)。我们得以通过PdfDocument对象的Bookmarks属性来取得该列表,然后经过Add
() 方法将书签添加到列表中。

二 、字母大小写标题。

//新建PDF文档

PdfDocument pdf = new PdfDocument();

//添加页面

PdfPageBase page = pdf.Pages.Add();

//添加书签
PdfBookmark bookmark = pdf.Bookmarks.Add("第一页");

//设置书签所指向的页面和位置,(0,0)表示页面的开始位置

bookmark.Destination = new PdfDestination(page);
bookmark.Destination.Location = new PointF(0, 0);

//设置书签的文本格式和颜色

bookmark.DisplayStyle = PdfTextStyle.Bold;
bookmark.Color = Color.Black;

//保存文档

pdf.SaveToFile("Bookmark2.pdf");

  在正则表明式的同盟结果是分别字母的大小写的,Ben只可以合营出Ben,而不能够合作出ben、BEN……等。

图片 1

 

                     

叁 、匹配任意字符。

1.2 添加子书签

  在正则表明式里,字符 能够匹配任何1个单个字符,字母、数字设置是.字符本人。

添加子书签和添加普通书签的方法基本相同,分裂的是普通书签是平素抬高到文书档案的书签列表里,而子书签则是加上到父书签的列表里。

 

//新建PDF文档

PdfDocument pdf = new PdfDocument();

//添加页面

PdfPageBase page = pdf.Pages.Add(); 

//添加书签

PdfBookmark bookmark = pdf.Bookmarks.Add("第一章 热传导");

//设置书签指向的页面和位置

bookmark.Destination = new PdfDestination(page);
bookmark.Destination.Location = new PointF(0, 0);

//设置书签的文本格式和颜色

bookmark.DisplayStyle = PdfTextStyle.Bold;
bookmark.Color = Color.SeaGreen;

//添加子书签

PdfBookmark childBookmark = bookmark.Insert(0, "1.1 热传导基本知识");

//设置子书签指向的页面和位置

childBookmark.Destination = new PdfDestination(page);
childBookmark.Destination.Location = new PointF(400, 300);

//设置子书签的文本格式和颜色

childBookmark.DisplayStyle = PdfTextStyle.Regular;
childBookmark.Color = Color.Black;

//保存文档

pdf.SaveToFile("ChildBookmark.pdf");

四 、匹配特殊字符。

图片 2

  .字符在正则表达式里拥有特别的意义。假使合营格局里需求同盟出二个.,就供给在上马加\开始展览转义,假如要协作\这需要\\

 

 

1.3 添加书签到存活文书档案

二:匹配一组字符

除去在新建的PDF文档里添加书签,我们还足以给现有的PDF文书档案添加书签。加载PDF文书档案的点子除LoadFromFile以外,还有LoadFromStream
(从流加载),LoadFromHTML(从HTML加载)等,可依据自个儿的要求选用相应的加载方式。

一 、字符集合区间

//加载文档

PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("示例.pdf"); 

for (int i = 0; i < pdf.Pages.Count; i++)
{
    //添加书签

    PdfBookmark bookmark = pdf.Bookmarks.Add(string.Format("第{0}章", i+1));

    //设置书签指向的页面和位置

    bookmark.Destination = new PdfDestination(pdf.Pages[i]);
    bookmark.Destination.Location = new PointF(0, 0);

    //设置书签的文本格式和颜色

    bookmark.DisplayStyle = PdfTextStyle.Bold;
    bookmark.Color = Color.Black;
}

//保存文档

pdf.SaveToFile("Bookmark2.pdf");

  匹配集合区间里面包车型地铁别的3个字符元素。

图片 3

如:要协作文本中na1.xls、na2.xls、sa1.xls

 

na1.xls
na2.xls
sa1.xls
ca1.xls
ca2.xls

2. 修改书签

正则表明式:[sn]a.\.xls

Spire.PDF支持多样书签修章,例如修改现有书签的内容,插入新书签到现有书签列表,插入子书签到存活书签等。那里自个儿选用修改书签内容和插入新书签到存活书签列表举行介绍。

常用的字符集合区间

2.1 修改现有书签内容

[0-9]等价[0123456789]:可以包容数字0123456789中的任意一个。

 

[a-z]:可以匹配a到z的有所小写字母。

//加载文档

PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("Bookmark2.pdf");

//获取书签列表

PdfBookmarkCollection bookmarks = pdf.Bookmarks;

//获取第一个书签

PdfBookmark bookmark = bookmarks[0];

//修改书签指向的页面

bookmark.Destination = new PdfDestination(document.Pages[1]); 

//修改书签的文本格式和颜色

bookmark.DisplayStyle = PdfTextStyle.Bold;
bookmark.Color = Color.Green;

//修改书签的title

bookmark.Title = "修改";

//保存文档

pdf.SaveToFile("ModifyBookmark.pdf");

[A-Z]:能够匹配A到Z的装有大写字母。

图片 4

[a-zA-Z]:匹配全数大大小小写字母。

 

[0-9a-zA-Z_]:匹配全部字符和数字和下划线。

2.2 安排新书签到存活书签列表

 

 

贰 、取非匹配。

//加载文档

PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("Bookmark2.pdf");

//插入新书签到指定位置(此处插入的是第三个书签的位置)

PdfBookmark bookmark = pdf.Bookmarks.Insert(2, "新增第三章");

//设置书签所指向的页面和位置

bookmark.Destination = new PdfDestination(document.Pages[1]);
bookmark.Destination.Location = new PointF(0, 300);

//保存文档

pdf.SaveToFile("InsertBookmark.pdf");

  字符集合常常用来内定一组必须协作在那之中之一的字符。但在少数地方,我们要求扭转做,给出一组不供给获得的字符。换句话说正是,除了那二个字符集合的字符,别的的字符都能够合营

 

 在聚集前法郎字符^来声明想对1个字符集合实行取非匹配。

 图片 5

如:[^sn]a.\.xls  :表示开端字母不是s和n的,首个字母是a的和后缀是.xls的享有字符串。

 

 

3. 删去书签

三:元字符。

去除书签时,能够动用书签的序号,也足以接纳书签的称谓。这里本人使用的是序号的不二法门。

  元字符大约能够分成三种:一种是用来配合文本的,比如是 ,其余一种是正则表达式所须要的,比如[]

//加载文档

PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("Bookmark2.pdf");

//获取书签列表

PdfBookmarkCollection bookmarks = document.Bookmarks;

//删除第一个书签

bookmarks.RemoveAt(0);

//保存文档

pdf.SaveToFile("DeleteBookmark.pdf");

① 、对特殊字符进行转义。

图片 6

  元字符是一对在正则表式里全数特别含义的字符。因为字符.是三个元字符,他得以用来合营任何二个单个字符。[表示1个聚众的开首,]意味着一个集合的终止。

 

也因为元字符在正则表明式里装有相当的意思,所以那么些字符就不恐怕发挥他们本身。如不能够利用.来表示.,不可能动用[]来表示[]。要想表示他们,须要在他们前增进转义字符\,如\.表示.\[\]表示[]

上述博主只总括了部分操作PDF书签的成效,假使需求详细摸底任何的效应,请查阅:http://e-iceblue.cn/Introduce/Spire-PDF-NET.html。如有任何疑问,欢迎给博主留言。欢迎转载,转载时请注明出处!

如:myArray\[[0-9]\]  :表示myArray[0]-myArray[9]。

 

 

 

二 、常用一些元字符。

 

①、[\b]回退并删除3个字符

②、\f换页符

③、\n换行符

④、\r回车符

⑤、\t制表符

⑥、\v垂直制表符

Windows使用\r\n文本行停止标签。Unix和Linux只用八个\n。
元字符\d等价[0-9];元字符\D等价[^0-9]
元字符\w等价[a-zA-Z0-9];\W等价[^a-zA-Z0-9]
元字符\s等价[\f\n\r\t\v];\S等价[^\f\n\r\t\v]
十六进制\x ,八进制\0
3、POSIX字符类:
①[:alnum:]等价[a-zA-Z0-9]
[:alpha:]等价[a-zA-Z]
[:blank:]等价[\t ]
④[:cntrl:]等价ASCII控制字符,即0-31,127
[:digit:]等价[0-9]
[:graph:]等价[:print:]-空格
[:lower:]等价[a-z]
[:print:]等价任一可打字与印刷字符
[:punct:]等价不是①④的
[:space:]等价[^\f\n\r\t\v]
[:upper:]等价[A-Z]
[:xdigit:]等价[a-fA-F0-9

 

四:五个地位十分

壹 、元字符+
,用于字符和集合之后,匹配一个或多少个字符(至少三个;不匹配零个字符的动静)。匹配+本身,用\+

② 、当在字符集合里,像.和+那样的元字符将被演讲为一般字符,不须求转义。

3、*与+用法相同,*合作字符或集合两次三番出现零次或频仍的情景。

4、元字符? ,只好合作三个字符(或集合)的零次或三回出现。

⑤ 、精确设置匹配次数,元字符{}成效:
①可安装双重匹配次数,如{5},则须要延续4遍。
②可安装双重匹配区间{2,4},2-四次
③可设置至少匹配次数{3,},叁遍以上

6、* 和 +
都以“贪婪型”元字符,其匹配行为无数。此时,可应用?后缀将其转会为“懒惰型”版本。如“贪婪型”:* 
+  {n,} ,“懒惰型”:*?  +?  {n,}?

如:文本This offer is not available to customers living in
<B>AK</B> and <b>HI</B>.

贪婪式:正则表明式:<[Bb]>.*</[Bb]>     
匹配的结果是:<B>AK</B> and <b>HI</B>

懒惰型:正则表明式:<[Bb]>.*?</[Bb]>    匹配的结果是:<B>AK</B>
和 <b>HI</B>.

 

五:地方匹配

1:边界

  假如要在那么些句子里:The cat scattered his food all over the
room.  

  正则表明式:cat  

  上边的正则表达式会把具有的cat都找出来,单词scattered里的cat也不会区别。倘诺大家只是要把句子中的cat单词找出来。办法只有三个,正是行使边界限定符,也正是在正则表达式里用一些差别通常的元字符来表达我们想匹配操作在怎么地点爆发。

(1)单词边界

  第3种境界也是最常用的分界是由限定符\b点名的单词边界。\b是用来协作二个单词的起先和终极。

在下面的事例里,使用边界限制符输入:

正则表明式:\bcat\b

同盟出来的结果正是单词:cat

专注:正则表明式引擎不知道意大利语,更不懂任什么人类语言,也不晓得什么是单词边界。简单地说:其实\b特出的是这样的二个职位,这么些地点放在1个能够用来构成单词的字符(包含字母,数字和下划线
\w)和一个不可能用来组成单词的字符(也正是\W相匹配的字符)之间。\b只卓殊2个职分,不包容任何的字符,用\bcat\b协作到的字符串的尺寸是三个字符。

 

万一想申明不匹配二个单词边界,使用\B。在上边例子里,使用\B来寻找八个上下都不是单词的疆界的连字符

句子:Please enter the nine-digit id as it appears on your color – coded
pass-key.

正则表达式:\b\w+-\w+\b

结果:nine-digit 和 pass-key.

 正则表明式:\B-\B

结果:- (匹配前后都不是单词边界的连字符)

留意:借使相匹配二个完好无损的单词,就务须在你想要匹配的公文的前后都加上\b限定符。

例子:

句子:The captain wore his cap and cape proudly as he sat listening to
the recap of his crew saved the men from a capsized vessel.

正则表明式:\bcap

  解析:只是匹配以cap起首的单词。结果:captain  cap  cape  capsized

正则表明式:cap\b

  解析:只是特出以cap结尾的单词。结果:cap  recap

正则表明式:\bcap\b

  解析:匹配cap单词本人。结果:cap

(2)字符串边界

  单词边界能够用来展开与单词有关的职位匹配(单词的始发,单词的下榻、整个单词等等……)。字符串边界有近似的用处,只可是是用来进展字符串有关的义务匹配而已(字符串的发端、字符串的住宿、整个字符串等等……)。用来定义字符串边界的要素有三个:一个用来定义字符串的起始 ,另二个用来定义字符串的结尾 

事例:判断上面是还是不是是合法的xml文书档案。

This is bad.
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<wsdl:definitions targetNamespace=”http://tips.cf
xmlns:impl=”http://tips.cf” xmlns:intf=”http”//tips.cf”
xmlns:apachesoap=”http://xml.apache.org/xml-soap

正则表明式:<\?xml.*\?>      
能检查和测试到xml的标志,可是因为它能同盟到第壹行xml的初步,无法当做检查和测试xml的正规。

修改后的正则表明式:^<\?xml.*\?>
 这样只有当xml的的起来在发轫第1行才能检测到。

 

  支行匹配情势:

  后面讲过^匹配二个字符串的开头,$匹配1个字符串的结尾。但这一定论并非相对正确,它还有三个例外或许说是一种转移那种行为的章程。

有这一个正则表明式都协助选择一些例外的元字符去改变其它一些元字符行为的做法,用来启用分行匹配格局的(?m)标志正是3个能更改别的元字符行为的元字符系列。分行匹配情势将使得正则表明式引擎把行分隔符当做三个字符串分隔符来对待。在分行匹配形式下,^非但合作符合规律的字符串开通,还将匹配行分割符(换行符)前面包车型地铁起先地方。

  在利用时,(?m)必须出现在全方位格局的最前面,就像上面那么些事例那样。

<SCRIPT>
function doSpellCheck(from , field){
//make sure not empty}
if (field.value == ”)
{
return false;
}
//init
var windowName=’spellwindow’;
var
spellCheckURL=’spell.cfm?formname=comment&fieldname=’+field”
name;

//Done
return false;
}

正则表明式:(?m)\s*//.*$    匹配全体注释行

结果: //make sure not empty} 
  //init    //Done

瞩目:还有许多的正则表明式达成不辅助(?m)

 

六:使用子表达式

  子表明式的概念:在前方学习了什么协作贰个字符的连日多次重复。正如\d+将相当2个或四个数字字符,而https?://将匹配http://或https://

在那三个例子里,事实上,是在大家原先见过的持有的例子里,用来注解重复次数的元字符(如?或*或{2},等等)只服从于紧挨着它的前叁个字符或元字符。

稍微短语(如Windows
两千)即使由八个单词构成,但实际是三个总体。有许多的HTML程序员喜欢让那类短语在浏览器里呈今后同一行。为了有限扶助那或多或少,他们会在编辑HTML文书档案时在这几个短语的单词之间接选举择非换行型空格(&nbsp
; nbsp是“non-breaking
space“)的缩写,其意思是”不是换行的空格“)而不是常见的空格。

事例:匹配下边文本的ip地址

Pinging hog.forta.com [12.159.46.200]
with 32 bytes of data:

正则表明式:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

留意\d{1,3}在那些方式里重现了陆回,它们各自匹配IP地址里的一组数字。IP地址里的4组数字有.分隔,该字符由方式里的转义连串\.肩负协作。

稍许留一下就意识,在那几个事例里,形式\d{1,3}\.(最多3个数字字符、后没跟着1个.)再而三出现二遍,它一样能够被发挥为叁个再度。

上面那个事例的另一种缓解方案:

正则说明式:(\d{1,3}\.){1,3}\d{1,3}

本条形式和方面包车型地铁具有相同的结果,但大家这一次试用了另一种语法:先用(和)吧表达式\d{1,3}\.括起来是他改成2个子表明式,再用(\d{1,3}\.){1,3}使这么些表达式重复叁遍。

 

子表明式的嵌套

  子表明式允许签到,事实上,子表达式允许多重嵌套。

如下面的拿走IP的子表明式

  任何一个1位或四个人的数字

  任何1个以1从头的3为数字。

  任何多个以2初叶、第1个人数字在0~4之间的3位数字。

  任何四个以25开头、第两人数字在0~5之间的3位数字。

正则表明式:(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))