当前位置:萝卜系统下载站 > 技术开发教程 > 详细页面

我的推荐:知道正则表达式

我的推荐:知道正则表达式

更新时间:2022-07-06 文章作者:未知 信息来源:网络 阅读次数:

了解正则表达式

--------------------------------------------------------------------------------

摘要

相信大家都听说过正则表达式,用它可以在字段中进行高速查找、替换等功能。使用正则表达式可以轻松的对文本进行控制。比如,如果您想知道一个字符串的数字表达式是否在 "0.1"–"9.9" 之间(注意,只有一位小数),您会用什么方法办到这个需求呢?我想您会一个 char 一个 char 的检测,这样会很麻烦,需要很多代码。我们这里有个更简单更快的解决方案,那就是正则表达式。本文将通过一些实际示例来体现正则表达式的应用和组成。


--------------------------------------------------------------------------------

目录

示例一:利用正则表达式检测字符串中数字为 "0.1"-"9.9"

示例二:利用正则表达式提取 url 中的信息

总结

参考信息

有关作者


--------------------------------------------------------------------------------

示例一:利用正则表达式检测字符串中数字为 “0.1”-“9.9”

这是我们刚才提到过的。我想大多数人都不会不耐其烦的先看理论,所以我们先从代码入手,我会在后面作解释的:

[Visual Basic]
Dim examples() As String = {"3.4", "0.0", "9.90", "04.9", "9.9", "0.1"}
Dim rule As New Regex("^[0-9]\.(?(?<=0\.)[1-9]|[0-9])$")
Dim i As Integer
For i = 0 To examples.GetUpperBound(0)
Console.WriteLine("{0} is between 0.1-0.9: {1}", _
examples(i), rule.IsMatch(examples(i)))
Next

Regex 封装了正则表达式,它在 System.Text.RegularExpressions 名字空间中。让我们来看看我们作了什么。我们创建了一个正则表达式,然后用这个正则表达式在各个 example 中搜索,符合表达式的将显示 True 而不符合的将显示 False。你会问,这个表达式到底是怎样的。好吧,让我们来分析一下:

^[0-9]\.(?(?<=0\.)[1-9]|[0-9])$

^ - 一行或 string 的开始。

$ - 一行或 string 的末尾。

[0-9] - 从 0 到 9 的任何一个数字。

\. - 一个"."。

(?(expression)yes|no) - 这代表一个选择,如果 expression 在这里被搜索到的话就执行 yes 部分,否则就执行 no 部分。注意没有空格!

(?<=expression) – 这是说在现在位置的左边有 expression。

好了,如果我们连贯起来说意思就是:"第一个字符是任何一个从 0 到 9 的数字,紧接着是一个 . 然后,如果前两个字符是 0. 的话最后这个字符就得是从 1 到 9 的任何一个数字,如果前两个字符不是 0. 的话那么最后的这个字符就可以是从 0 到 9 的任何一个数字。"好了,我们已经完成了第一个示例,我相信您对正则表达式和正则表达式的构造已经有一定的了解了吧?


--------------------------------------------------------------------------------

示例二:利用正则表达式提取 url 中的信息

让我们来假设一种情况,我们需要在一个 url 中提取 domain 部分,例如:

http://www.microsoft.com/china/community/

我们要提取 www.microsoft.com 这一部分。当然,用普通方法做到这一要求非常的困难,不过我们可以再次依赖正则表达式,让它来为我们轻松的完成工作。为了让构造更简单些,在这里我们假设所有的 url 都是 http 的,也就是说,不包括 ftp 或是其他的协议。这一次我们会逐步构件这个正则表达式:

1、 每个 web url 的开头都是 http:// 或 https:// 所以我们的正则表达式这样开始:

^https?://

这里唯一没有介绍过的部分是"?",它是一个数量修饰符,意思是说被他修饰的字符只能重复 0-1 次,0 次就是说被修饰的字符可以没有。

2、 接下来的部分一直到重新出现"/"就是我们需要提取的 domain 部分了。逻辑很简单,这样:

[^/]+

"[]"表示一组字符,"^"在"[]"里代表去除的意思,合起来说是除了"/"外所有的字符。"+"是一个数量修饰符,从 1-?,也就是说,至少有 1 个被修饰的字符。

3、 接下来的字符要么是一个"/"要么就是字符串的结尾。这也很容易理解,这一部分是:

(/|$)

"()"是用来定义一个组的,一个组可以有一个 id 或一个 name,组的用法我们将在后面提到。"|" 有 or 的意思,也就是说,这个字符或者是"/"或者是结尾。我们这里用一个组将其包括是因为如果不这样做,"|"将对前面的所有表达式响应而并不是单单的响应"/"。

好了,我们已经简单的构造了一个正则表达式,它的完整方式是:"^https?://[^/]+(/|$)"。在不久前当您看到这样一个表达式时您会感到很迷惑,不过现在对您来说这没有什么,显而易见。

我们已经构造了表达式,但是如何提取所需的部分呢?这就要用到组了。我们知道,一个组用"()"实现,它可以有一个 id number 也可以有一个 name,现在我们需要知道如何定义 id 与 name。

id:由表达式自动安排。每个完整的表达式永远是第 0 组,然后按"()"的顺序安排 id。拿我们的例子来说,"^https?://[^/]+(/|$)" 是第 0 组,"(/|$)" 是第一组。

name:(?<name>expression) 是用来定义有 name 的组的。这样的组当然也有一个 id,但他们可以用 name 来调用,这样就方便了在编程时的使用。我们将用这种方式来提取 domain。

也就是说,我们将在负责搜索 domain 的部分加上一个组,而负责 domain 的部分是这一段:[^/]+,加上一个名叫 domain 的组之后就是这样的了:(?<domain>[^/]+),现在我们的正则表达式是:"^https?://(?<domain>[^/]+)(/|$)"。有了这个正则表达式编程的代码就好写了:

[Visual Basic]
Dim examples(2) As String
examples(0) = "https://www.microsoft.com/china/community/"
examples(1) = "https://www.microsoft.com"
examples(2) = "http://www.microsoft.com/"
Dim rule As New Regex("^https?://(?<domain>[^/]+)(/|$)")
Dim i As Integer
For i = 0 To examples.GetUpperBound(0)
Console.WriteLine(rule.Match(examples(i)).Groups("domain"))
Next

Match 是一个符合表达式的结果,这一段是说获得一个符合表达式的结果,然后显示它的 domain 组中的内容,也就是我们要提取的 domain 了。当然,这一段代码很可能会发生错误,比如当没有 Match 的时候,不过本文重点讨论正则表达式,所以这些不足就留给读者解决了。


--------------------------------------------------------------------------------

总结

在本文中讨论过的主题:

 正则表达式是干什么用的

 正则表达式的构造方法

 正则表达式的构造策略

本文还对正则表达式的应用和它的一些组成部分作了探讨。本文的目的是抛砖引玉,希望读者在读完后能够自己推敲,摸索正则表达式更深一步的使用。


--------------------------------------------------------------------------------

参考信息

极力推荐文档中的 Regular Expression Language Elements

有英文版的朋友们可以用以下链接:

ms-help://MS.VSCC/MS.MSDNVS/cpgenref/html/cpconregularexpressionslanguageelements.htm


--------------------------------------------------------------------------------


作者:袁伟(Kefroth)

温馨提示:喜欢本站的话,请收藏一下本站!

本类教程下载

系统下载排行

网站地图xml | 网站地图html