ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

正则表达式——简单的模式匹配

正则表达式——简单的模式匹配 简单的模式匹配1、匹配字符串字面值2、匹配数字3、匹配非数字字符4、匹配单词和非单词字符5、匹配空白符6、再谈匹配任意字符7、给文本加标签7.1、用sed为文本加标签7.2、用Perl为文本加标签被匹配的文本如下THERIMEOFTHEANCYENTMARINERE,INSEVENPARTS.ARGUMENT.How a Ship having passed the Line was driven by Storms to the cold Country towards the South Pole;and how from thence she made her course to the tropical Latitudeofthe Great Pacific Ocean;andofthe strange things that befell;andinwhat manner the Ancyent Marinere came back to his own Country.I.1It is an ancyent Marinere,2And he stoppeth oneofthree:3By thy long grey beard and thy glittering eye4Now wherefore stoppest me?1、匹配字符串字面值正则表达式最为直接和明显的功能就是用一个或多个字符字面值来匹配字符串。匹配字符串字面值的方法就是使用普通的字符。这听起来是否有些熟悉呢这就和你在Word等字处理程序中使用查找或者在搜索引擎中输入关键字类似。当你以逐个字符对应的方式查找文本字符串的时候就是在用字符串字面值查找。举个例子如果你要匹配以上诗文中开头部分的单词Ship只需在RegExr上方的文本框中键入Ship该单词就会在下方的文本框中标亮首字母要大写​。2、匹配数字在RegExr中左上方的文本框中输入以下字符组简写式来匹配数字\d因为默认勾选了global全局匹配复选框这将会匹配下方文本区域中所有的阿拉伯数字。现在用字符组替代\d来匹配相同的内容。在RegExr的上方文本框中输入以下范围的数字[0-9]虽然语法不一样但\d和[0-9]的效果是一样的。字符组[0-9]表示范围这意味着它会匹配0至9范围内的数字。你也可以列出0至9范围内的所有数字来进行匹配[0123456789]如果只想匹配0和1两个数字可以使用这个字符组[01]请在RegExr中尝试一下[12]并看看结果。使用字符组可精确匹配字符。数字的字符组简写式\d更为简短但却没有字符组强大、灵活。在无法使用\d时不是所有情况下都支持这种方式​或者想匹配特定数字时就需要使用字符组合适的时候可以使用\d因为它更简短。3、匹配非数字字符通常可以将简写式取反取反的结果就是排除。比如要匹配非数字字符可使用包含以下大写字母D的简写式\D请在RegExr中试一试。大写字母D取代小写字母d就会匹配非数字字符如图所示​。该简写式与以下字符组取反的作用相同字符组取反的意思其实就是“不匹配这些”或“匹配除这些以外的内容”​​[^0-9]下面这个表达式作用也一样[^\d]4、匹配单词和非单词字符在RegExr中将\D替换为\w这个简写式将匹配所有的单词字符前提是勾选global选项​。\D与\w的区别是\D会匹配空格、标点符号引号、连字符、反斜杠、方括号等字符而\w却不会它只匹配字母、数字和下划线。在英语环境中与\w匹配相同内容的字符组为[_a-zA-Z0-9]现在用大写字母W匹配非单词字符\W在本示例中这个简写式匹配空格、标点以及其他非字母、非数字字符。使用以下字符组也可以匹配相同的内容[^_a-zA-Z0-9]字符组允许你匹配更多类型的字符但有时你不想而且也没有必要键入所有字符。这也就是“按键次数最少则胜”的原则。但有时你确实需要将所有的字符键入才能得到准确的结果。反正你自己决定。轻松一下在RegExr中试一下[^\w]以及[^\W]下表提供了更多的字符简写式。不过并不是所有的正则表达式处理器都能识别这些简写式。5、匹配空白符可以用以下简写式匹配空白符\s请在RegExr试一试并看看高亮的部分​。以下字符组与\s匹配的内容相同[\t\n\r]也就是说它会匹配空格制表符\t换行符\n回车符\r可想而知\s也有对应的大写形式。要匹配非空白字符则使用\S这个简写式匹配除空白符之外的所有符号。它匹配字符组[^\t\n\r]或者是[^\s]除了\s匹配的字符之外还有其他不太常见的空白字符。下表列出了匹配常见和不太常见的空白字符的简写式。6、再谈匹配任意字符用正则表达式匹配任意字符的一种方法就是使用点号U002E​。点号可以匹配除行结束符之外的所有字符个别情况除外。在RegExr中去掉对global复选框的勾选。这样任何正则表达式都会匹配目标文本中第一个匹配项。在RegExr上方的文本框中键入单个点号来匹配任意字符。如图所示点号匹配了目标文本中的第一个字符T。要匹配THE RIME整个短语则可使用八个点号........但这种方法太麻烦所以推荐用量词.{8}这个表达式就能匹配前两个单词以及它们之间的空格但只是粗略地匹配。勾选global旁的复选框看看这个表达式还有什么作用你就知道我所说的粗略是什么意思了。它匹配了连续多组的八个字符头尾相连只有目标文本的最后几个字符除外。下面我们再试试匹配单词的边界和字母的开始和结束位置。在RegExr上方文本框中键入以下内容可以看到细微的差异\bA.{5}T\b这个表达式有更强的特指性请记住特指性specificity这个概念很重要​它匹配单词ANCYENT也就是ancient的旧式拼写形式。这是如何做到的呢简写式 \b匹配单词边界不消耗任何字符字符A和T限定了字符序列的首尾字母.{5} 匹配任意五个字符简写式 \b匹配单词的另一个边界。这个正则表达式实际上可以匹配ANCYENT和ANCIENT。现在再试一下这个简写式\b\w{7}\b最后再试试匹配零个或多个字符.它就相当于[^\n]或[^\n\r]类似地点号也可以与表示“一个或多个”的量词连用.请在RegExr中尝试这些表达式它们都会匹配第一行内容在取消勾选global复选框的情况下​。原因是点号通常不会匹配折行符例如换行符U000A或回车符U000D​。勾选dotall旁边的复选框然后和就会匹配下方文本框中的全部文本。​dotall表示点号匹配包括换行符在内的所有字符。​这就涉及量词的贪心特性了。所谓“贪心”​greedy​指量词会匹配所有能匹配的字符。别急第7章会详细介7、给文本加标签怎么让“The Rime of the Ancient Mariner”的内容以网页而不是纯文本形式显示呢换句话说怎么使用正则表达式而不是手写方式为它们添加HTML5标签呢在之后的几章中我会陆续展示相应的方法本章先从简单情况的开始。点击RegExr中的Replace替换标签选中multiline多行选项然后在第一个文本框中键入(^T.*$)这个表达式会从文件的开始匹配诗文的第一行然后使用括号将文本捕获到一个分组中。在第二个文本框中键入h1$1\/h1这个替换表达式将$1捕获的内容嵌套在了h1标签中。可以在底部的文本框中看到结果。$1是一个Perl风格的后向引用。此外在包括Perl在内的多数实现程序中还可以使用\1表示后向引用但是RegExr只支持$1、$2、$3这样的方式。7.1、用sed为文本加标签在命令行中使用sed也可以为文本添加标签。sed是Unix流编辑器它支持用正则表达式转换文本。sed最初在20世纪70年代早期由Lee McMahon于贝尔实验室开发。如果用户使用的是Mac或者Linux那就已经有sed了。请在shell提示符比如Mac中的Terminal终端窗口中测试以下内容echo Hello|sed s/Hello/Goodbye/运行的过程应该如下echo命令将在标准输出设备通常是屏幕中打印单词Hello竖线符|将打印内容通过管道传到之后的sed命令管道将echo的输出转为sed的输入sed的s命令将单词Hello变为Goodbye而Goodbye就显示在屏幕上了。现在试着在命令或shell提示符中键入sed-ns/^/h1/; s/$/\/h1/p; qrime.txt以下是正则表达式处理器的工作过程解析。首先调用sed程序。sed默认的操作是直接复制每行输入并输出-n选项覆盖了该默认操作。之所要覆盖默认操作是因为我们只想让正则表达式影响第1行。s/ ^/h1/在行的开头^添加h1标签。分号;用于分隔命令。s/$/\/h1/在行的结尾$添加/h1标签。命令p会打印受影响的那一行第1行​。与-n不同后者会打印所有行。最后命令q会结束程序这样sed程序就只会处理第1行。所有的操作都是针对rime.txt文件执行的。这行命令还有另一种写法即用-e选项分别引导每个命令。我当然更喜欢使用带分号的写法因为那种写法更简短。sed-nes/^/h1/-es/$/\/h1/p-eqrime.txt可以将这些命令写到文件里比如这里所示的文件h1.sed该文件就在之前所说的代码库里​#! /usr/bin/sed s/^/h1/ s/$/\/h1/ q若要运行该文件请在与rime.txt同一个路径或文件夹里运行如下命令sed-fh1.sed rime.txt7.2、用Perl为文本加标签最后我将展示如何用Perl来做类似的事。Perl是由LarryWall于1987年创立的一种通用程序设计语言。它以对正则表达式的强大支持和文本处理能力而闻名。在命令提示符中键入perl-v然后回车看看你的系统中是否已经安装了Perl。该命令会返回系统中Perl的版本信息或者返回错误。在命令提示符中键入perl-neif ($. 1) { s/^/h1/; s/$/\/h1/m; print; }rime.txt就可以得到和sed示例中一样的输出结果。以下是这个Perl命令的执行过程解析。perl调用了Perl程序。-n选项输出全部输入内容rime.txt文件​。-e选项允许在命令行而不用在文件中提交程序代码。if语句检查是否在第一行。在Perl中$是个特殊的变量它匹配当前行。第一个替换命令s先找到第一行的开头^然后插入h1标签。第二个替换命令s搜寻行结尾$再插入/h1标签。替换命令最后的m多行修饰符表示将本行单独处理这样$就只匹配第一行的结尾而不会匹配整个文本的结尾。最后在标准输出设备屏幕中打印出结果。所有这些操作都是针对rime.txt文件的。同样可以将这些命令放入程序文件中比如示例代码库中的h1.pl文件。#! /usr/bin/perl -nif($.1){s/^/h1/;s/$/\/h1/m;print;}然后在rime.txt的同一个目录下执行如下命令perl h1.pl rime.txt
返回列表