65.9K
CodeProject 正在变化。 阅读更多。
Home

轻松学习正则表达式 (RegEx)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (151投票s)

2011年6月4日

CPOL

7分钟阅读

viewsIcon

519675

downloadIcon

1

在本文中,我们将尝试理解什么是正则表达式以及如何轻松记住那些晦涩的语法。

目录

点击下方图片还可以观看我的正则表达式视频。

那么,日程安排是什么?

正则表达式一直是编写验证最流行、最简单的方法。正则表达式唯一大的问题是晦涩的语法。处理复杂验证项目的开发人员总是参考某种备忘单来记住语法和命令。

在本文中,我们将尝试理解什么是正则表达式以及如何轻松记住那些晦涩的语法。

供您参考:本文将使用C#语言演示正则表达式的实现,如果您使用其他语言,语法可能会有所不同。 

您可以在我的.NET面试题和答案视频中观看关于WCF、SilverLight、LINQ、WPF、设计模式、Entity Framework等各个部分的内容。

万一您是新来的,什么是正则表达式?

正则表达式或常规表达式帮助我们描述文本中的复杂模式。一旦描述了这些模式,就可以使用它们来搜索、替换、提取和修改文本数据。

下面是一个简单的正则表达式示例。第一步是导入正则表达式的命名空间。

using System.Text.RegularExpressions;

接下来是用模式创建正则表达式对象。下面的模式指定搜索10位长度的a-z之间的字母。

Regex obj = new Regex(“[a-z]{10}”);

最后,在数据上搜索模式以查看是否有匹配项。如果模式匹配,“IsMatch”将返回true。

MessageBox.Show(obj.IsMatch(“shivkoirala”).ToString());

3个重要的正则表达式命令

记住正则表达式语法的最佳方法是记住三个东西:方括号、插入符号和美元符号。

B

在正则表达式中有3种方括号

方括号“[”和花括号“{”括号。

方括号指定需要匹配的字符,而花括号指定字符的数量。“(" 用于分组。

在本文的后续内容中,我们将对此进行理解。

C 插入符号“^”标记模式的开始。^可以出现在模式的开头,要求匹配发生在行的最开头。例如,^xyz匹配xyz123但不是123xyz。 
D 美元符号“$”标记模式的结束。$可能出现在模式的末尾,要求匹配发生在行的最末尾。例如,pqr$匹配123pqr但不是pqr123。 

插入符号(^)和美元符号($)指示模式在被搜索字符串的开头或结尾。这两个锚点可以组合使用。例如,^pqr$只匹配pqr。它之前的任何字符或之后的任何字符都会使模式无效。  

现在,一旦您了解了以上三个语法,您就可以编写世界上任何验证了。例如,下面的验证显示了上述三个实体是如何组合在一起的。  

 

  • 上面的正则表达式模式只接受介于“a”到“z”之间的字符。用方括号标记来定义范围。
  • 花括号表示最小和最大长度。
  • 最后,正则表达式模式开头的插入符号和正则表达式模式末尾的美元符号指定了模式的开始和结束,从而使验证更加严格。

现在,使用上述3个命令,让我们来实现一些正则表达式验证。


检查用户是否输入了shivkoirala?

shivkoirala

让我们从第一个验证开始,输入存在于a-g之间的字符?

[a-g]

输入长度为3的[a-g]之间的字符?

[a-g]{3}

输入最大3个字符,最小1个字符的[a-g]之间的字符?

[a-g]{1,3}

如何验证用户输入了像91230456、01237648等8位固定数字格式的数据?

^[0-9]{8}$

如何验证最小长度为3,最大长度为7的数字数据,例如-123、1274667、87654?

我们只需调整第一个验证,添加逗号并在花括号中定义最小和最大长度。

^[0-9]{3,7}$


验证格式为LJI1020的发票号,前3个字符是字母,其余是8位数字?

前3个字符验证
^[a-z]{3}
8位数字验证
[0-9]{8}


现在将所有内容组合在一起。

^[a-z]{3}[0-9]{7}$


检查格式为INV190203或inv820830的格式,前3个字符为不区分大小写的字母,其余为8位数字?

在前面的问题中,正则表达式验证器只会验证发票号的前3个字符是否为小写字母。如果您输入大写字母,它将显示为无效。为了确保前3个字母不区分大小写,我们需要使用^[a-zA-Z]{3}进行字符验证。

完整的正则表达式验证如下所示。

^[a-zA-Z]{3}[0-9]{7}$


我们能看到一个简单的网站URL验证吗?

步骤 正则表达式
第一步:检查www是否存在
^www.
第二步:域名至少应为1个字符,最多为15个字符。
. [a-z]{1,15}
第三步:最后应以.com或.org结尾
. (com|org)$
^www[.][a-z]{1,15}[.](com|org)$

让我们看看您的BCD是否适用于电子邮件验证?

步骤 正则表达式
第一步:电子邮件可以以字母数字开头,最小1个字符,最多10个字符,后跟at符号(@)
^[a-zA-Z0-9]{1,10}@
第二步:@之后的域名可以是字母数字,最小1个字符,最多10个字符,后跟一个“.”
[a-zA-Z]{1,10}.
第三步:最后应以.com或.org结尾
.(com|org)$
^[a-zA-Z0-9]{1,10}@[a-zA-Z]{1,10}.(com|org)$

验证数字在0到25之间

^(([0-9])|([0-1][0-9])|([0-2][0-5]))$

使用MM/DD/YYYY、YYYY/MM/DD和DD/MM/YYYY格式验证日期

步骤

正则表达式

描述

让我们检查DD。第一个DD的范围是1-29(2月),1-30(小月),1-31(大月)。

所以DD是1-9或01-09

[1-9]|0[1-9]

这允许用户输入1到9或01到09之间的值。

现在还添加了DD检查,从10到19

[1-9]|1[0-9]

这允许用户输入01到19之间的值。

现在将DD检查添加到上述内容中,从20到29

[1-9]|1[0-9]|2[0-9]

这允许用户输入01到29之间的值。

现在将DD检查添加到上述内容中,从30到31

[1-9]|1[0-9]|2[0-9]|3[0-1]

最终用户可以输入01到31之间的值。

现在,分隔符可以是/或-

[/ . -]

这允许用户通过定义分隔符来分隔日期。

现在对MM应用相同的方法

[1-9]|0[1-9]|1[0-2]

这允许用户输入01到12之间的月份值。

然后是YY

1[9][0-9][0-9]|2[0][0-9][0-9]

允许用户输入1900到2099年之间的年份值。

^([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])[- / .]([1-9]|0[1-9]|1[0-2])[- / .](1[9][0-9][0-9]|2[0][0-9][0-9])$ for "DD/MM/YYYY" 

要获取MM/DD/YYYY,请使用以下正则表达式模式。

^([1-9]|0[1-9]|1[0-2])[- / .]([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])[- / .](1[9][0-9][0-9]|2[0][0-9][0-9])$

最后,要获取YYYY/MM/DD,请使用以下正则表达式模式。

^(1[9][0-9][0-9]|2[0][0-9][0-9])[- / .]([1-9]|0[1-9]|1[0-2])[- / .]([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])$

快捷方式

您还可以使用以下常用快捷命令来缩短您的正则表达式验证。

实际命令 快捷方式
[0-9] \d
[a-z][0-9][_] \w
0次或多次出现 *
1次或多次出现 +
0次或1次出现 ?

正则表达式快速参考

非常简洁的备忘单 http://www.dijksterhuis.org/csharp-regular-expression-operator-cheat-sheet/

.NET 4.5中的正则表达式超时功能

评估正则表达式所需的时间与正则表达式的复杂性和字符数成正比。简单地说,如果您有更多的字符,解析所需的时间就更长。

正则表达式解析的这种典型行为可能会被黑客利用,通过进行DOS攻击永远挂起您的网站。下面是一个不错的Facebook .NET正则表达式视频,演示了正则表达式DOS攻击是什么样的。

.NET 4.5中引入了正则表达式超时功能来克服这个问题,您可以从这里阅读相关内容。

通过设置超时,您可以克服正则表达式DOS攻击。

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.