在本章中你将学习到什么是正则表达式以及可以做什么事情。
理解需求
正则表达式(
Regular Expression
,
regex
)是一个工具。向所有其他工具一样,正则表达式是用来解决一类特定问题的。理解正则表达式以及其可以做什么的最好方式就是理解它们可以解决什么问题。
考虑下面的一些场景:
-
你在一个文件中搜索“
car
”单词(不区分大小写),但是不能处于另外一个单词中(例如scar,
carry, 和incarcerate等)。
-
你通过使用应用服务器动态生成了一个
Web
页面,需要显示从数据库中获取的文本。文本中可能含有
URL
,你需要使得这些
URL
在
Web
页面上是可以点击的。所以除了生成文本,还需要生成一个合法的
HTML
标签(<A
HREF></A>)。
-
你创建了一个包含表单的
Web
页面,并提示用户输入
Email
信息,你可能需要验证用户的输入是否正确(起码是一个语法合格的电子邮件地址)。
-
你在修改源代码,需要将所有的
size
替换为
iSize
。但是只是针对
size
,而不包括单词中的
size
。
-
你显示了计算机系统中的所有文件,但是你希望找到那些包含有“
Application
”文本的文件。
-
你在导入一些数据到应用程序中。这里的数据是使用
TAB
分隔的,但是你的应用却是支持
CSV
格式(每一行一条数据,采用逗号分隔,每条采用引号括起来)。
-
你需要在文件中寻找特定的文本,但是是位于特定的位置(可能是在一行的开始或者是一个句子的结尾)。
这里的场景都给出了一个特定的编程问题。只要是支持条件控制和字符串处理的语言都可以解决这些问题。但是这里的问题解决起来是多么的复杂?需要循环到每个字符,执行所有的
if
语句,跟踪大量的标志来决定哪些已经找到哪些没有找到,检查空格和其他特殊字符等等。而这些都必须自己手工完成。
或者你可以使用正则表达式。上面的所有问题都可以通过一个特殊设计的语句来解决。这是一个非常精炼的字符串,包含有文本和一些特殊的指示符,就像下面一样:
\b[Cc][Aa][Rr]\b
如果对于上面的这行没有感觉的话,没有关系,马上就会有了。
正则表达式的使用方法
再看看上面的场景,发现这些问题可以分为两类:找到特定的信息(搜索)或者找到特定的信息并修改(替换)。事实上,这就是正则表达式可以完成的功能:搜索和替换。每个正则表达式要么匹配文本(执行搜索),要么匹配文本并替换(执行替换)。
RegEx 查找
正则表达式适合用于搜索动态的文本数据,就像前面搜索
car
的场景一样。你可能需要找到car、CAR 、Car 甚至是
CaR,这个部分很简单(很多的搜索工具都可以不区分大小查找文本)。麻烦的部分在于不要匹配上scar, carry和incarcerate
。有些高级的编辑器有着“匹配整个单词”的选秀,但是许多并没有,使得你可能不会对你正在编辑的文档做修改。使用正则表达式的搜索功能,找到
car
单词,就可以解决此问题。
提示:
想知道这个问题的答案吗?其实你已经看到过了——就是你在前面见到过的示例代码:\b[Cc][Aa][Rr]\b。
在查找的时候没有必要检查其相等性(例如判断用户输入的
Email
地址是否匹配正则表达式?)。用户的整个输入都会被搜索(对比子串查找,这是很多搜索中常用的)。
RegEx 替换
正则表达式查找非常的强大和游泳,而且并不是那么难学习。事实上,许多的教程和例子都只是查找。但是,正则表达式的强大威力则在于其替换,就像前面场景中出现的将
URL
转换为可点击的
URL
一样。首先需要在文本中定位到
URL
的位置(可能通过搜索
http://
或者
https://
开头而以句号
、逗号或者是空格结束的字符串)。然后需要将找到的
URL
替换为嵌入在
HTML
中的两个字符串。如
http://www.forta.com/
需要替换为<A HREF="http://www.forta.com">http://www.forta.com/</A
>。
许多应用中的“查找和替换”选项并不能处理这里的替换操作,但是这里使用正则表达式却是如此的简单。
那到底什么是正则表达式?
现在你已经知道正则表达式的用途了,现在是其定义了。简单地说,正则表达式是可以用来匹配和修改文本的字符串。可以使用正则表达式语言来创建正则表达式,这是一个用来完成以前工作的特殊语法语言。就像所有其他语言一样,正则表达式语言也有着特殊的语法和指示符。这也是本书要告诉你的。正则表达式语言并不是一个完整的编程语言。它甚至不是一个可以安装使用的语言或者工具。幸运的是,现在的大部分语言和工具都支持正则表达式语言。而不幸的消息则是这些语言和工具所支持的正则表达式语言并不是相同的。同时,正则表达式语言并不直观,难以直接看懂。
正则表达式发明于
1950
年代的数学领域研究。不久后,这个早期工作的思想和规则就被引入到
Unix
世界引入到
Perl
语言以及其他如
grep
的小工具中。在很长的时间里,正则表达式(前面介绍过可以使用的场景)被排除在
Unix
团体以外,但是现在这个状况已经改变,正则表达式几乎在所有的计算平台上都得到了支持。
为了有个直观概念,下面的都是合法的正则表达式(稍后将会对其感兴趣):
-
Ben
-
.
-
www\.forta\.com
-
[a-zA-Z0-9_.]*
-
<[Hh]1>.*</[Hh]1>
-
\r\n\r\n
-
\d{3,3}-\d{3,3}-\d{4,4}
需要提及的是语法是掌握正则表达式中最容易的部分。真正的挑战将是学习如何应用这些语法、如何将问题分解成可以解决的正则表达式问题。这好像并不是看一本书能够学会的,而是像其他语言一样,需要大量的练习。
使用正则表达式
在前面解释过,并没有什么正则表达式程序。它并不是你能够运行的程序,也不是你可以购买或者下载的软件。但是,正则表达式语言被实现在许多软件产品、语言、工具和开发环境中。
正则表达式的使用范围和以及其功能的使用对于各个应用程序来说差别是很大的。有些应用使用菜单选项和电话看来访问正则表达式,不同的编程语言则提供了不同的类或者函数用来显示正则表达式的功能。
另外,并不是所有的正则表达式实现是一样的。在不同的语法和特性中总是存在着一些微小的差别(当然有些时候并不微小)。
附录
A
:流行应用和语言中的正则表达式,提供了支持正则表达式的应用和工具的详细使用情况。在进行到下一章之前,可以翻到这个附录看看你将要使用的应用或者是语言的语法。
为了能够帮助你更快的入门,你可以从本书的
Web
页面上
http://www.forta.com/books/0672325667/
下载一个正则表达式测试应用。这个应用是基于
Web
的,这里有使用流行应用服务器和语言的版本,包括直观的
JavaScript
。这个应用在附录
C
中介绍:正则表达式测试器。在测试正则表达式的时候使用是非常方便和很有好处的。
在开始之前
在继续学习正则表达式之前,注意下面的几点:
-
当使用正则表达式的时候,你可能发现对于任何一个问题都有多种解决方案。有些可能比较简单,而有些则是比较快,而另外一些则具有更好的移植性,还有一些则兼容性更强。所以在书写正则表达式的时候,并没有一个简单的正确或者错误的答案(只要你的答案可以工作)。
-
当开始后,你可能会发现在正则表达式的实现方面存在有不同。在本书中用到的例子将尽可能的使用主流的正则表达式实现来完成,不同或者是不兼容的地方都会提及。
-
对于任何语言,学习正则表达式的秘诀是练习、练习和再练习。
我建议你尝试本书中的每个正则表达式代码。
小结
正则表达式是文本处理的最强大工具之一。正则表达式语言用来创建正则表达式(最后构造出来的字符串称为正则表达式),同时正则表达式可以用来执行查找和替换操作。
分享到:
相关推荐
1. 元字符的使用:正则表达式通过使用元字符来构建表达式模式,这些元字符包括但不限于点号(.)、星号(*)、加号(+)、问号(?)、方括号([])、花括号({})、圆括号(())等。这些字符在正则表达式中有着特殊...
在这个名为"shell正则表达式.zip"的压缩包中,包含了一个名为"正则表达式.jpg"的文件,推测这可能是一张图片,用于可视化地展示了一些常见的Shell正则表达式用法。 Shell正则表达式是基于Bash或其他Unix/Linux ...
正则表达式系统教程 chm 文件。 目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。 ...
目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。 正则表达式的使用,可以通过简单...
以下是我整理的一些正则表达式的常用例子,旨在帮助理解其基本用法和功能。 1. **基本匹配** - 匹配单个字符:`\d` 代表数字,`\w` 代表字母或数字,`\s` 代表空白符。 - 匹配范围:`[a-z]` 匹配小写字母,`[A-Z]...
有一段时间,正则表达式学习很火热很潮流,当时在CSDN一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的《C#字符串和正则表达式参考手册》学习了一些基础的知识,同时也为我在CSDN大概赚了...
文章目录Python爬虫(二十三)—— Re库与正则表达式的细节解析 ——1. 麻烦的反斜杠2. 零宽断言 1. 麻烦的反斜杠 上一篇中我们已经提到了,正则表达式使用 ‘’ 字符来使得一些普通的字符拥有特殊的能力(例如 \d...
又受五笔字型字根表口诀“白手看头三二斤…”的启发, 试作“正则表达式助记口诀”又名“正则打油诗”,版本0.1,绝对原创,仿冒必究,:) 注:本文仅为学习正则时为了便于记忆而作,不能代替系统而全面的学习过程...
在IT行业中,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,用于匹配、查找、替换或提取字符串中的特定模式。本项目“regex_debug-html.rar_DEMO”是一个JavaScript实现的正则表达式验证的...
《跟我学Nginx+Lua开发》是一本针对Nginx与Lua结合使用的教程书籍,旨在帮助读者理解如何利用这两种技术进行高效且灵活的Web应用开发。Nginx作为一款广泛使用的高性能HTTP服务器和反向代理服务器,在处理高并发连接...
"高级Bash脚本编程指南--中文版(advance_bash_scriipt_progaming_guide).pdf" 和 "苹果脚本跟我学.pdf" 这两本书籍,提供了丰富的资源来帮助初学者和有经验的开发者提升Bash脚本编写技能。 Bash脚本是通过Shell...
此篇文章是记录我在学习Java正则表达式时候学到的和遇到的坑。 先来说说 Matcher 里面的三个方法(取的结果以group()方法为例子) matches():整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回False...
安装过程中,可以加入特定的参数来安装内置模块,例如使用--with-http_realip_module安装取用户真实IP的模块,--with-pcre安装Perl兼容的正则表达式模块,--with-luajit集成LuaJIT模块,以及使用add-module添加...
《跟我学Spring3》是针对初学者和有一定基础的开发者设计的一套全面、深入的教程,旨在帮助读者理解和掌握Spring3框架的核心概念和技术。本教程共计13个章节,覆盖了Spring3.0和3.x版本的主要特性。下面将详细阐述第...
### 跟我学写Makefile #### 概述与目的 本文档旨在通过系统而详尽的方式指导读者学习如何编写Makefile。Makefile是一种用于自动化构建过程的脚本文件,广泛应用于软件开发中,特别是在大型项目的编译过程中。通过...
3.10 如果我不使用表达式的值, 我应该用++i 或i++ 来自增一个变量 吗? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.11 为什么如下的代码int a = 100, b = 100; long int c = a * b;...
分析:每张图片都为 bimg 图片,作为正则表达式的筛选对象。注意:每种产品不一定是一张图片,需要对多张图片进行考虑 iii.简介:见后面图片 分析: 简介末尾都有 <!--/商品属性--> ,作为正则表达式的...