《学习正则表达式》读书笔记二

来源:互联网 发布:淘宝企业店铺开通 编辑:程序博客网 时间:2024/04/27 16:06

第二章 简单的匹配模式

网址

http://regexr.com/

github 地址

https://github.com/michaeljamesfitzgerald/Introducing-Regular-Expressions

匹配的文本

THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.ARGUMENT.How a Ship having passed the Line was driven by Storms to the coldCountry towards the South Pole; and how from thence she made her courseto the tropical Latitude of the Great Pacific Ocean; and of the strangethings that befell; and in what manner the Ancyent Marinere came back tohis own Country.I.1      It is an ancyent Marinere,2        And he stoppeth one of three:3      "By thy long grey beard and thy glittering eye4        "Now wherefore stoppest me?

2.3 匹配非数字字符

  • 通常可以将简写式取反,取 反的结果就是排除。比如, 要匹配非数字字符,可使用 包含以下大写字母D的简写 式:
\D
[^0-9]    或者   [^\d]

2.4 匹配单词和非单词字符

\w
  • \D 和 \w的区别是 \D 会匹配空格,标点符号(引号,连字符,反斜杠,方括号)等字符,而\w却不会,他只匹配字母,数字和下划线。

在英语环境中,与\w 匹配相同内容的字符组为

[_a-zA-Z0-9]

\W 简写式匹配空格,标点以及其他非字母,非数字字符

\W

等同于

[^_a-zA-Z0-9]

试验

[^\W]
[^\w]

2.5 匹配空白字符

  • 可以用以下简写式匹配空白 符:
\s

或者

[ \t\n\r]
  • 空格
  • 制表符(\t)
  • 换行符(\n)
  • 回车符(\r)
可以看到 http://regexr.com/ 中的空格和制表符会标亮,但是换行符和回车符不会
\S[^ \t\n\r][^\s]

2.6 再谈匹配任意字符

匹配 ANCYENT

\bA.{5}T\b
  • 这个表达式有更强的特指 性(请记住特指性,specificity,这个概念很重要),它 匹配单词ANCYENT。

    • 简写式\b匹配单词边界,不消耗任何字符;
    • 字符A和T限定了字符序列的 首尾字母;
    • .{5}匹配任意五个字符;
    • 简写式\b匹配单词的另一个 边界。

匹配7个字母的单词

\b\w{7}\b

试一下

.+  和 [^\n] 或者 [^\n\r]

2.7.1 用sed为文本加标签

echo Hello | sed s/Hello/Goodbye/
  • echo命令将在标准输出设备 中打印单词Hello,
  • 竖线符(|)将打印内容 通过管道传到之后的sed 命令;
  • 管道将echo的输出转为sed的输入;
  • sed的s命令将单词 Hello变为Goodbye,而 Goodbye 就显示在屏幕上了。

克隆项目

git clone https://github.com/michaeljamesfitzgerald/Introducing-Regular-Expressions.git

在命令行中输入

sed -n 's/^/<h1>/;s/$/<\/ h1>/p;q' rime.txt

输出

<h1>THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.</ h1>
  • 首先调用sed程序。
  • sed默认的操作是直接复制 每行输入并输出,
  • -n 选项覆盖了该默认 操作。 之所要覆盖默认 操作,是因为我们只想让正 则表达式影响第1行。
  • 在行 的 开头(^)添加标签
  • 命令p会 打印 受 影响 的 那 一行(第1行)。与- n 不同, 后者会打印所 有行。
  • 最后 命令 q 会 结束 程序, 这样 sed 程序 就 只会 处理 第 1 行。
  • 所有 的 操作 都是 针对 rime. txt 文件 执行 的。

2.7.2 用Perl为文本加标签

在命令行输入

perl -ne 'if ($.==1) { s/^/<h1>/; s/$/<\/h1>/m; print; }' rime.txt

输出

<h1>THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.</h1>

以下是这个Perl命令的执行过程解析。

  • perl 调用 了 Perl 程序。
  • -n 选项 输出 全部 输入 内容( rime. txt 文件)。
  • -e 选项 允许 在 命令行( 而 不用 在 文件) 中 提交 程序 代码。
  • if语句检查是否在 第一 行。 在 Perl 中$. 是个 特殊 的 变量它 匹配 当前 行。
  • 第一个 替换 命令 s 先 找到 第一 行的 开头(^)然后 插入标签。
  • 第二个 替换 命令 s 搜寻 行 结尾($)再插入标签。
  • 替换 命令 最后 的 m( 多 行) 修饰 符, 表示 将 本行 单独 处理; 这样,$ 就 只 匹配 第一 行的 结尾 而 不会 匹配 整个 文本 的 结尾。
  • 最后 在 标准 输出 设备( 屏幕) 中 打印 出 结果。
  • 所有这些 操作 都是 针对 rime.txt 文件 的。