第二章 简单的匹配模式
网址
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 cold
Country towards the South Pole; and how from thence she made her course
to the tropical Latitude of the Great Pacific Ocean; and of the strange
things that befell; and in what manner the Ancyent Marinere came back to
his 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 eye
4 "Now wherefore stoppest me?
创建文件 resample2 输入以上内容
2.3 匹配非数字字符
- 通常可以将简写式取反,取 反的结果就是排除。比如, 要匹配非数字字符,可使用 包含以下大写字母D的简写 式:
\D
执行
grep '\D' resample2 --color
结果如下
[^0-9] 或者 [^\d]
执行
grep '[^0-9]' resample2 --color
结果如下
2.4 匹配单词和非单词字符
\w
- \D 和 \w的区别是 \D 会匹配空格,标点符号(引号,连字符,反斜杠,方括号)等字符,而\w却不会,他只匹配字母,数字和下划线。
执行
grep '\w' resample2 --color
结果如下
在英语环境中,与\w 匹配相同内容的字符组为
[_a-zA-Z0-9]
执行
grep '[_a-zA-Z0-9]' resample2 --color
结果如下
\W 简写式匹配空格,标点以及其他非字母,非数字字符
\W
执行
grep '\W' resample2 --color
结果如下
等同于
[^_a-zA-Z0-9]
执行
grep '[^_a-zA-Z0-9]' resample2 --color
结果如下
试验
[^\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 文件 的。