了解正则表达式

 2023-09-07 阅读 21 评论 0

摘要:了解正则表达式 摘要 相信大家都听说过正则表达式,用它可以在字段中进行高速查找、替换等功能。使用正则表达式可以轻松的对文本进行控制。比如,如果您想知道一个字符串的数字表达式是否在 "0.1"–"9.9" 之间(注意,只有一位小数&
了解正则表达式

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

目录
示例一:利用正则表达式检测字符串中数字为 "0.1"-"9.9"
示例二:利用正则表达式提取 url 中的信息
总结
参考信息
有关作者

示例一:利用正则表达式检测字符串中数字为 “0.1”-“9.9”
这是我们刚才提到过的。我想大多数人都不会不耐其烦的先看理论,所以我们先从代码入手,我会在后面作解释的:
[C#]
string[] examples = {"3.4", "0.0", "9.90", "04.9", "9.9", "0.1"};Regex rule = new Regex(@"^[0-9]/.(?(?<=0/.)[1-9]|[0-9])$");for (int i = 0; i < examples.Length; i++) {Console.WriteLine("{0} is between 0.1-0.9: {1}",
examples[i], rule.IsMatch(examples[i]));
}[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 IntegerFor 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>[^/]+)(/|$)"。有了这个正则表达式编程的代码就好写了:
[C#]string[] examples = new string[3];examples[0] = "https://www.microsoft.com/china/community/";examples[1] = "https://www.microsoft.com";examples[2] = "http://www.microsoft.com/";Regex rule = new Regex(@"^https?://(?<domain>[^/]+)(/|$)");for (int i = 0; i < examples.Length; i++) {Console.WriteLine(rule.Match(examples[i]).Groups["domain"]);}[Visual Basic]Dim examples(2) As Stringexamples(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 IntegerFor i = 0 To examples.GetUpperBound(0)Console.WriteLine(rule.Match(examples(i)).Groups("domain"))Next
Match 是一个符合表达式的结果,这一段是说获得一个符合表

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/11418.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息