什么是正则表达式?
正则表达式(也称为正则表达式)是一种在文本字符串中搜索和替换的简洁灵活的方法。使用正则表达式,您可以轻松匹配文本中的字符、单词或模式。一个非常基本的例子是正则表达式/c*t/——这将匹配“cat”、“cot”或“cut”,但不匹配“pat”或“but”。
我今天将向您展示的正则表达式将允许您匹配:
用户名
密码
十六进制值
蛞蝓
一封电邮
一个网址
IP 地址
一个 html 标签
日期
随着列表的下降,正则表达式变得越来越复杂。
关于正则表达式要记住的关键是它们几乎同时被向前和向后读取。当我们谈论匹配 HTML 标签时,这句话会更有意义。
正则表达式中使用的分隔符是正斜杠:/. 每个模式都以分隔符开始和结束。如果正斜杠出现在正则表达式中,我们必须使用反斜杠将其转义,如下所示\/:
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.匹配密码
图案:
/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$^&*()_-]).{8,18}$/
描述:
使密码难以猜测的一种方法是确保人们至少包含一个数字、至少一个小写字母、至少一个大写字母和至少一个特殊字符。对我们来说,包含某种长度检查也是有意义的。例如,密码长度必须在 8 到 18 个字符之间。
我们的正则表达式检查所有这些条件。正则表达式分为五个不同的部分。前四部分是正向前瞻表达式——在括号中,前缀为?=.. 正向前瞻表达式将匹配字符串中的任何位置;他们不需要按顺序出现。让我们(?=.*\d)作为一个例子来考虑。它在我们的字符串中的任何地方查找任何数字。同样,(?=.*[a-z])查找任何小写字母,并(?=.*[A-Z])查找大写字母。
请记住,我们没有(?=.*[a-zA-Z])在正则表达式中使用该表达式。这意味着无论是小写字母还是大写字母都会产生积极的结果。我们想要大小写字母。
匹配的字符串:
Myp^ssw0rd
不匹配的字符串:
Myp^ssword(不包含任何数字)
3.匹配一个十六进制值
图案:
/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i
描述:
我们首先告诉解析器找到字符串 ( ^) 的开头。接下来,井号是可选的,因为它后面跟着一个?. 问号告诉解析器前面的字符——在这种情况下是一个井号——是可选的,但要“贪婪”并在它存在时捕获它。
接下来,在第一组(第一组括号)内,我们可以有两种不同的情况。第一个是 a 和 f 之间的任何小写字母或数字六次。|告诉我们,我们也可以在 a 和 f 或数字之间使用三个小写字母。
最后,我们想要字符串的结尾 ( $)。i我们还通过在表达式末尾添加一个来使用不区分大小写的标志。这将使我们能够匹配#ffffff以及#FFFFFF.
我把这六个字符放在前面的原因是解析器将捕获一个十六进制值,如#ffffff. 如果我把它颠倒过来,让三个字符先出现,解析器只会拾取#fff而不是其他三个 'f'。
匹配的字符串:
#a3c113
不匹配的字符串:
#4d82h4(包含字母 h)
4.匹配一个蛞蝓
图案:
/^[a-z0-9-]+$/
描述:
mod_rewrite如果您必须使用漂亮的 URL,您将使用此正则表达式。我们首先告诉解析器找到字符串 ( ^) 的开头,然后是一个或多个(加号)字母、数字或连字符。最后,我们想要字符串的结尾 ( $)。
匹配的字符串:
my title is here
不匹配的字符串:
my_title_here(包含下划线)
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
图案:
/^(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 标签
图案:
/^<([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 格式的日期。
图案:
/^([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 天。但是,这会使正则表达式变得不必要地复杂。对这些边缘情况使用日期验证库更为实用。
结论
我希望你已经更好地掌握了正则表达式背后的思想。希望您将在未来的项目中使用这些正则表达式!很多时候,您不需要逐个字符地破译正则表达式,但有时如果您这样做,它会帮助您学习。请记住,不要害怕正则表达式——它们可能看起来不像,但它们让你的生活更轻松。只需尝试从没有正则表达式的字符串中提取标签名称!
- 图案:
- 描述:
- 匹配的字符串:
- 不匹配的字符串:
- 图案:
- 描述:
- 匹配的字符串:
- 不匹配的字符串:
- 描述:
- 匹配的字符串:
- 不匹配的字符串:
- 图案:
- 描述:
- 匹配的字符串:
- 不匹配的字符串:
- 图案:
- 描述:
- 匹配的字符串:
- 不匹配的字符串:
- 图案:
- 描述:
- 匹配的字符串:
- 不匹配的字符串:
- 图案:
- 描述:
- 匹配的字符串:
- 不匹配的字符串:
- 图案:
- 描述:
- 匹配的字符串:
- 不匹配的字符串:
- 图案:
- 描述:
发表评论