{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

你是如何学会正则表达式的?

eternalshalloweternalshallow 回答0 收藏1
收藏问题

3条回答

Chiclaim

Chiclaim

回答于2022-06-28 14:08

正则表达式(regular expression,简称RegEx或regex)和正则表达式语言已经出现很多年了。但很多人并没有完全理解整理正则表达式的用途以及它能解决什么样的问题,还有很多人觉得正则表达式的语法不直观,有时候甚至难以理解

事实上,正则表达式其实远没有第一眼看上去那么复杂,理解了下面几个问题,学会正则表达式并不困难。


1.正则表达式是什么?


简单地说,正则表达式是一些用来匹配和处理文本的字符串,是文本处理方面功能最强大的工具之一。正则表达式语言用来构造正则表达式(最终构造出来的字符串就称为正则表达式),正则表达式用来完成搜索和替换操作

与其他程序设计语言一样,正则表达式语言也有必须要学习的特殊语法和指令。但正则表达式语言并不是一种完备的程序设计语言,更准确地说,正则表达式语言是内置于其他语言或软件产品里的“迷你”语言。正则表达式既不是可以直接运行的应用程序,也不是可以从哪里购买或下载下来的软件。在绝大多数的软件产品、编程语言、实用工具和开发环境里,正则表达式语言都已被实现。


2.正则表达式是用来干什么的?


正则表达式是用来完成搜索和替换操作的。

请考虑以下几个场景:

  • 你正在搜索一个文件,这个文件里包含单词car(不区分字母大小写),但你并不想把包含字符串car的其他单词(比如scar、carry和incarcerate)也找出来。
  • 你需要在文件里搜索某个特定的文本,但你只想把出现在特定位置(比如每行的开头或是每条语句的结尾)的文本找出来。
  • 你正在编辑一段源代码并且要把所有的size都替换为isize,但这种替换仅限于单词size本身,并不涉及那些包含字符串size的其他单词。
  • 你编辑了一段包含电子邮件地址的文本。现在,你想把文本里的电子邮件地址全都转换为可点击的链接。

以上场景是大家在编写程序时经常会遇到的问题,用任何一种条件处理和字符串操作的编程语言都可以解决,但问题是这种解决方案会变得十分复杂。比较容易想到的办法是,用一些循环来一次遍历那些单词并在循环体里面用一系列if语句来进行测试,这往往意味着你需要使用大量的标志来记录已经找到了什么、还没有找到什么,另外少不了要检查空白字符和特殊字符,等等。而这一切都需要一遍又一遍地以手工方式进行。

另一种解决方案则是使用正则表达式,避开繁琐的手工步骤,让搜索和替换变得无比简单


3.正则表达式怎么学?


和学习编程语言一样,动手实践是学习正则表达式的一种非常有效的方式。通过分析下面几个小案例,你会发现正则表达式其实很简单:

  • 搜索单词car:

我们要把car、CAR、Car和CaR都找出来,并且确保scar、carry和incarcerate之类的单词不会被匹配到。一些比较高级的编辑器提供了“仅匹配整个单词”选项,但还有很多编辑器并不具备这一功能,而我们往往无法在正在编辑的文档里做出这种调整。使用正则表达式进行搜索就可以解决这个问题:

表示单词边界,[Cc]表示C或c中的任何一个,[Aa]与[Rr]同理,这样一个简单的正则表达式语句就解决了单词搜索的问题。

  • 匹配URL

https?: / / 匹配http:// 或 https:// (?使得字符s成为可选项)。[ - w . ] +匹配主机名。( : d + ) ? 匹配一个可选的端口号。 ( / ( [ w / _ . ] * ) ? ) ?匹配路径:外层的子表达式匹配 /(如果存在的话),内层的子表达式匹配路径本身。这个模式虽然无法处理查询字符串,也不能正确解读嵌在URL之中的“username:password”(用户名:密码)。不过,它已经足以处理绝大多数的URL了(匹配主机名、端口号和路径)。

上面两个正则表达式都是用来搜索的,而正则表达式的真正威力体现在替换操作方面:

  • 把电子邮件地址转换为可点击的链接:

替换操作需要用到两个正则表达式:一个用来指定搜索模式,另一个用来指定替换模式。反向引用可以跨模式使用,在第一个模式里匹配的子表达式可以用在第二个模式里。这里使用的模式(w+[w.]*@[w.]+.w+)写成了一个子表达式。这样一来,被匹配到的文本就可以用于替换模式。<a href="mailto:$1">$1</a>使用了两次已匹配的子表达式:一次是在href属性里(用于指定mailto:),另一次是作为可点击文本。所以ben@forta.com变成了<a href="mailto:ben@forta.com">ben@forta.com</a> ,这是我们想要的结果。

绝大多数应用程序的“搜索和替换”选项都可以实现这种替换操作,但使用正则表达式来完成这个任务将简单得让人难以置信。

以上几个案例的原理分析和运行代码分别出自这本《正则表达式必知必会(修订版)》以及配套网页BEN FORTA

让很多人觉得正则表达式很难的原因之一是缺乏相关的优质资源。一些正则表达式方面的书,以及包含正则表达式教程的大部分Web站点,往往过于偏重语法,只是在讲 { 是干什么的,+ 与 * 之间有什么区别。这些东西都不难,真正棘手的地方在于弄明白,该如何运用正则表达式去解决实际问题。

如果你想全面地学习、精通正则表达式,Jeffrey Friedl先生的《精通正则表达式(第3版)》绝对是这方面权威又全面的著作,可以说是一本正则表达式大全。不过,如果你是一位初学者,想尽快上手正则表达式,还是建议题主利用这本《正则表达式必知必会(修订版)》,由浅入深地学习,并将学到的东西立刻运用于实践,解决实际问题。

这本书从简单的文本匹配开始,循序渐进地介绍了很多复杂内容,包括反向引用、条件评估、环视等。每章都配有许多简明实用的示例,有助于全面、系统、快速掌握正则表达式,并运用它们解决实际问题。配套网页提供的在线测试工具“regular expression 101”让你既能动手编写正则表达式,还能快速查阅在线资料,这些在线工具是测试正则表达式的最简单的方法。


欢迎关注@人民邮电出版社 头条号,在这里发现更多优质图书与学习资源。

评论0 赞同0
  •  加载中...
Chaz

Chaz

回答于2022-06-28 14:08

这边学会得益于工作中有用到正则表达式的场景,日常配置一些规则匹配http 请求中的url、参数等时,为了更加精准需要配置正则表达式。正则表达式目前使用的场景其实并不多:数据处理、安全防护、搜素引擎等。个人觉得它跟sql语言比较像,除了核心领域外,其他it类工作时不时都会用到,但是就算会了之后一段时间不用就又不会了。总得来说,学会正则表达式需要找到具体使用的场景,且要经常用,不在于勤、多,而在于连、精。

评论0 赞同0
  •  加载中...
caikeal

caikeal

回答于2022-06-28 14:08

应该是通过理论性的学习加上实践的感悟和总结而得,掌握辨清事非,对与错,白与黑的能力,在表达时因人因事就会由感而发。

评论0 赞同0
  •  加载中...

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<