• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

什么是正则表达式?(你应该知道的 9 个正则表达式)

什么是正则表达式

正则表达式(也称为正则表达式)是一种在文本字符串中搜索和替换的简洁灵活的方法。使用正则表达式,您可以轻松匹配文本中的字符、单词或模式。一个非常基本的例子是正则表达式/c*t/——这将匹配“cat”、“cot”或“cut”,但不匹配“pat”或“but”。

我今天将向您展示的正则表达式将允许您匹配:

  1. 用户名

  2. 密码

  3. 十六进制值

  4. 蛞蝓

  5. 一封电邮

  6. 一个网址

  7. IP 地址

  8. 一个 html 标签

  9. 日期

随着列表的下降,正则表达式变得越来越复杂。

关于正则表达式要记住的关键是它们几乎同时被向前和向后读取。当我们谈论匹配 HTML 标签时,这句话会更有意义。

正则表达式中使用的分隔符是正斜杠:/. 每个模式都以分隔符开始和结束。如果正斜杠出现在正则表达式中,我们必须使用反斜杠将其转义,如下所示\/:

1.匹配用户名

什么是正则表达式?(你应该知道的 9 个正则表达式)  第1张

图案:

/^[a-zA-Z0-9_-]{3,16}$/

描述:

我们首先告诉解析器找到字符串的开头 ( ^),然后是任何小写字母 ( a-z)、大写字母 ( A-Z)、数字 ( 0-9)、下划线或连字符。接下来,{3,16}确保这些字符中至少有 3 个,但不超过 16 个。最后,我们想要字符串的结尾 ( $)。

匹配的字符串:

my-USER_n4m3

不匹配的字符串:

th1s1s-wayt00_l0ngt0beausername (too long)

2.匹配密码

什么是正则表达式?(你应该知道的 9 个正则表达式)  第2张

图案:

/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$^&*()_-]).{8,18}$/

描述:

使密码难以猜测的一种方法是确保人们至少包含一个数字、至少一个小写字母、至少一个大写字母和至少一个特殊字符。对我们来说,包含某种长度检查也是有意义的。例如,密码长度必须在 8 到 18 个字符之间。

我们的正则表达式检查所有这些条件。正则表达式分为五个不同的部分。前四部分是正向前瞻表达式——在括号中,前缀为?=.. 正向前瞻表达式将匹配字符串中的任何位置;他们不需要按顺序出现。让我们(?=.*\d)作为一个例子来考虑。它在我们的字符串中的任何地方查找任何数字。同样,(?=.*[a-z])查找任何小写字母,并(?=.*[A-Z])查找大写字母。

请记住,我们没有(?=.*[a-zA-Z])在正则表达式中使用该表达式。这意味着无论是小写字母还是大写字母都会产生积极的结果。我们想要大小写字母。

匹配的字符串:

Myp^ssw0rd

不匹配的字符串:

Myp^ssword(不包含任何数字)

3.匹配一个十六进制值

什么是正则表达式?(你应该知道的 9 个正则表达式)  第3张

图案:

/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i

描述:

我们首先告诉解析器找到字符串 ( ^) 的开头。接下来,井号是可选的,因为它后面跟着一个?. 问号告诉解析器前面的字符——在这种情况下是一个井号——是可选的,但要“贪婪”并在它存在时捕获它。

接下来,在第一组(第一组括号)内,我们可以有两种不同的情况。第一个是 a 和 f 之间的任何小写字母或数字六次。|告诉我们,我们也可以在 a 和 f 或数字之间使用三个小写字母。

最后,我们想要字符串的结尾 ( $)。i我们还通过在表达式末尾添加一个来使用不区分大小写的标志。这将使我们能够匹配#ffffff以及#FFFFFF.

我把这六个字符放在前面的原因是解析器将捕获一个十六进制值,如#ffffff. 如果我把它颠倒过来,让三个字符先出现,解析器只会拾取#fff而不是其他三个 'f'。

匹配的字符串:

#a3c113

不匹配的字符串:

#4d82h4(包含字母 h)

4.匹配一个蛞蝓

什么是正则表达式?(你应该知道的 9 个正则表达式)  第4张

图案:

/^[a-z0-9-]+$/

描述:

mod_rewrite如果您必须使用漂亮的 URL,您将使用此正则表达式。我们首先告诉解析器找到字符串 ( ^) 的开头,然后是一个或多个(加号)字母、数字或连字符。最后,我们想要字符串的结尾 ( $)。

匹配的字符串:

my title is here

不匹配的字符串:

my_title_here(包含下划线)

5.匹配电子邮件

什么是正则表达式?(你应该知道的 9 个正则表达式)  第5张

图案:

/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,63})$/

描述:

我们首先告诉解析器找到字符串 ( ^) 的开头。在第一组中,我们匹配一个或多个小写字母、数字、下划线、点或连字符。我已经转义了点,因为未转义的点表示任何字符。

紧接着,必须有一个@标志。接下来是域名,它必须是一个或多个小写字母、数字、下划线、点或连字符。然后是另一个(转义)点,扩展名是 2 到 63 个字母或点。由于特定***/地区的 TLD(.ny.us 或 .co.uk),我有 2 到 63 个,当然,新规则允许更长的 TLD。最后,我们想要字符串的结尾 ( $)。

匹配的字符串:

john@doe.com

不匹配的字符串:

john@doe(缺少顶级域名)

6.匹配一个URL

什么是正则表达式?(你应该知道的 9 个正则表达式)  第6张

图案:

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/

描述:

这个正则表达式几乎就像将上述正则表达式的结尾部分放在“https://”和末尾的文件结构之间。这听起来比实际上要简单得多。首先,我们使用插入符号搜索行的开头。

第一个捕获组都是可选的。它允许 URL 以“http://”、“https://”或两者都不开头。我在s之后有一个问号,以允许具有http或https的 URL 。为了使整个组可选,我只是在其末尾添加了一个问号。

接下来是域名:一个或多个数字、字母、点或连字符后跟另一个点,然后是两到六个字母或点。

以下部分用于可选文件和目录。在组内,我们希望匹配任意数量的正斜杠、字母、数字、下划线、空格、点或连字符。然后我们说这个组可以匹配任意多次。这允许多个目录与最后的文件一起匹配。我使用星号代替问号是因为星号表示零或多个,而不是零或一。 

然后匹配尾部斜杠,但它可以是可选的。最后,我们以行尾结束。

匹配的字符串:

https://www.weixiaolive.com/about

不匹配的字符串:

http://google.com/some/file!.html(包含感叹号)

7.匹配IP地址

图案:

/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/

描述:

现在,我不会撒谎,我没有写这个正则表达式;我从RegExr得到它。

第一个捕获组实际上不是一个捕获组,因为?:它被放置在内部,它告诉解析器不要捕获这个组(在最后一个正则表达式中对此进行了更多说明)。我们还希望这个未捕获的组重复 3 次——{3}在组的末尾。该组包含另一个组、一个子组和一个文字点。解析器在子组中查找匹配项,然后查找要继续前进的点。

该子组也是另一个非捕获组。它只是一堆字符集,它们一起描述了 0 到 255 之间的数字(括号内的内容):字符串“25”后跟 0 到 5 之间的数字;或字符串“2”和一个介于 0 和 4 之间的数字以及任何数字;或一个可选的零或一个后跟两个数字,第二个是可选的。

在我们匹配其中三个之后,它进入下一个非捕获组。这一个想要:字符串“25”后跟一个介于 0 和 5 之间的数字;或字符串“2”,数字介于 0 和 4 之间,末尾有另一个数字;或一个可选的零或一个后跟两个数字,第二个是可选的。

我们以字符串结尾结束这个令人困惑的正则表达式。

匹配的字符串:

73.60.124.136

不匹配的字符串:

256.60.124.136(所有部分必须小于255)

8.匹配一个 HTML 标签

什么是正则表达式?(你应该知道的 9 个正则表达式)  第7张

图案:

/^<([a-z\d]+)([^<]+)*(?:>(.*)<\/\1>|\s*\/>)$/

描述:

列表中更有用的正则表达式之一。它将任何 HTML 标记与里面的内容相匹配。像往常一样,我们从行首开始。

首先是标签的名称。它必须是一个或多个字母长。这是第一个捕获组,当我们必须抓取结束标签时它会派上用场。接下来是标签的属性。这是除大于号 ( >) 之外的任何字符。由于这是可选的,但我想匹配多个字符,因此使用星号。加号构成属性和值,星号表示您想要的任意多个属性。

接下来是第三个非捕获组。在内部,它将包含一个大于号、一些内容和一个结束标记;或一些空格、正斜杠和大于号。第一个选项查找大于号后跟任意数量的字符和结束标记。\1使用它表示在第一个捕获组中捕获的内容。在这种情况下,它是标签的名称。现在,如果无法匹配,我们要查找一个自闭合标签(如img、br或hr 标签)。这需要有一个或多个空格,后跟“/>”。

正则表达式以行尾结束。

匹配的字符串:

<h1 data-tip="Some Hint">一个大标题</h1>

不匹配的字符串:

<h1 data-tip="Some Hint">A big Heading</h2>(开始和结束标签不匹配)。

9.日期

日期在世界各地以多种格式书写。对于这个特定示例,我们将关注遵循 DD/MM/YYYY 或 DD/MM/YY 格式的日期。

什么是正则表达式?(你应该知道的 9 个正则表达式)  第8张

图案:

/^([1-2][0-9]|3[0-1]|0?[1-9])([-\.\/ ])(1[0-2]|0?[1-9])(\2)([\d]{4}|[\d]{2})$/

描述:

让我们从日期开始。一个月中的日期可以从最小值 1 到最多 31。用户还可以将日期写为 02 而不是仅 2 来表示月份中的某一天。我们用表达式的第一部分涵盖了所有这些场景。如您所见,如果第一个数字是 1 或 2,我们允许第二个数字是 0 到 9 之间的任何值。如果第一个数字是 3,则第二个数字只能是 0 或 1。

对于分隔符,我们希望字符只能是连字符、点、空格或斜杠。这被放在一个捕获组中,以便我们可以检查月份和年份值之间是否使用了相同的分隔符。

月份最多只能是 12,所以如果第一个数字是 1,我们只允许第二个数字为 0、1 或 2。对年份数字没有限制。它可以是任何四位数字,例如 1508 或 9999。我们还允许将年份写成两位数字,以防有人想将日期写为 11/09/91。

请记住,上述正则表达式适用于格式为 DD/MM/YYYY 的日期。尝试将其修改为日期格式 MM/DD/YYYY。

我想指出的另一件事是,上述正则表达式将 31.02.1991 视为有效日期。但是,我们知道这是一个无效的日期,因为 2 月最多有 29 天。我们可以编写正则表达式来确保 2 月份的天数在平年不超过 28 天,在闰年不超过 29 天。但是,这会使正则表达式变得不必要地复杂。对这些边缘情况使用日期验证库更为实用。

结论

我希望你已经更好地掌握了正则表达式背后的思想。希望您将在未来的项目中使用这些正则表达式!很多时候,您不需要逐个字符地破译正则表达式,但有时如果您这样做,它会帮助您学习。请记住,不要害怕正则表达式——它们可能看起来不像,但它们让你的生活更轻松。只需尝试从没有正则表达式的字符串中提取标签名称!


文章目录
  • 什么是正则表达式?
  • 1.匹配用户名
      • 图案:
      • 描述:
      • 匹配的字符串:
      • 不匹配的字符串:
  • 2.匹配密码
      • 图案:
      • 描述:
      • 匹配的字符串:
      • 不匹配的字符串:
  • 3.匹配一个十六进制值
      • 描述:
      • 匹配的字符串:
      • 不匹配的字符串:
  • 4.匹配一个蛞蝓
      • 图案:
      • 描述:
      • 匹配的字符串:
      • 不匹配的字符串:
  • 5.匹配电子邮件
      • 图案:
      • 描述:
      • 匹配的字符串:
      • 不匹配的字符串:
  • 6.匹配一个URL
      • 图案:
      • 描述:
      • 匹配的字符串:
      • 不匹配的字符串:
  • 7.匹配IP地址
      • 图案:
      • 描述:
      • 匹配的字符串:
      • 不匹配的字符串:
  • 8.匹配一个 HTML 标签
      • 图案:
      • 描述:
      • 匹配的字符串:
      • 不匹配的字符串:
  • 9.日期
      • 图案:
      • 描述:
  • 结论
  • 发表评论