正则表达式是一组字符或符号,用于从文本中查找特定的模式。
正则表达式是从左到右匹配主题字符串的模式。“正则表达式”这个词很拗口,通常缩写为“regex”或“regexp”。正则表达式用于替换字符串中的文本、验证表单、根据模式匹配从字符串中提取子字符串等等。
假设你正在编写一个应用程序,并希望设置用户选择用户名的规则。我们希望允许用户名包含字母、数字、下划线和连字符。我们还希望你限制用户名中的字符数,这样看起来就不会太难看。我们使用下面的正则表达式来验证用户名:
上面的正则表达式可以接受字符串john_doe、jo-hn_doe和john12_as。它不匹配Jo,因为该字符串包含大写字母,而且太短。
正则表达式只是我们用于在文本中执行搜索的字符模式。例如,正则表达式the
表示:字母t
,后跟字母h
,后跟字母e
。
"the" => The fat cat sat on the mat.
测试正则表达式
正则表达式123匹配字符串123。通过逐个比较正则表达式中的每个字符和输入字符串中的每个字符,可以对输入字符串匹配正则表达式。正则表达式通常区分大小写,因此正则表达式不会与字符串匹配。
"The" => The fat cat sat on the mat.
测试正则表达式
元字符是正则表达式的基础。元字符不代表自己,而是以某些特殊方式解释。一些元字符具有特殊含义,并写在方括号内。
元字符如下:
元字符 | 描述 |
---|---|
。 | 句点匹配除换行符以外的任何单个字符。 |
[] | 角色类。匹配方括号之间包含的任何字符。 |
[^] | 否定的角色类。匹配方括号之间不包含的任何字符 |
* | 匹配0个或多个前一个符号的重复。 |
+ | 匹配前一个符号的1个或多个重复。 |
? | 使前面的符号为可选。 |
{n,m} | 大括号。至少匹配前一个符号的“ n”个但不超过“ m”个重复。 |
(xyz) | 字符组。以完全相同的顺序匹配字符xyz。 |
| | 交替。匹配符号之前或之后的字符。 |
\ | 转义下一个字符。这使您可以匹配保留字符 { } . * + ? ^ $ \ | |
^ | 匹配输入的开头。 |
$ | 匹配输入的结尾。 |
句号.
是元字符的最简单示例。元字符.
与任何单个字符匹配。它将不匹配返回或换行符。例如,正则表达式的.ar
意思是:任何字符,后跟字母a
,后跟字母r
。
".ar" => The car parked in the garage.
字符集也称为字符类。方括号用于指定字符集。在字符集中使用连字符指定字符的范围。方括号内字符范围的顺序无关紧要。例如,正则表达式[Tt]he
表示:大写T
或小写t
,后跟字母h
,后跟字母e
。
"[Tt]he" => The car parked in the garage.
测试正则表达式
但是,字符集内的句点表示原义句点。正则表达式的ar[.]
意思是:小写字符a
,后跟letter r
,后跟句点.
字符。
"ar[.]" => A garage is a good place to park a car.
测试正则表达式
通常,脱字符号表示字符串的开头,但是在方括号中键入时,它会否定
字符集。例如,正则表达式的[^c]ar
意思是:除之外的任何字符c
,其后是该字符a
,然后
是字母r
。
"[^c]ar" => The car parked in the garage.
测试正则表达式
在元字符之后+
,*
或?
用于指定子模式可以出现多少次。这些元字符在不同情况下的行为不同。
该符号*
与前面的匹配项的零个或多个重复匹配。正则表达式的a*
意思是:零个或多个前面小写字符的重复a
。但是,如果它出现在字符集或类之后,则它将找到整个字符集的重复。例如,正则表达式的[a-z]*
意思是:连续任意数量的小写字母。
"[a-z]*" => The car parked in the garage #21.
测试正则表达式
该*
符号可与元字符.
一起使用,以匹配任何字符串.*
。该*
符号可与空白字符\s
一起使用,以匹配一串空白字符。例如,该表达式的\s*cat\s*
意思是:零个或多个空格,后跟小写字符c
,其次是小写字符a
,然后是小写字符t
,然后是零个或多个空格。
"\s*cat\s*" => The fat cat sat on the concatenation.
测试正则表达式
该符号+
与前一个字符的一个或多个重复匹配。例如,正则表达式的c.+t
意思是:小写字母c
,后跟至少一个字符,后跟小写字符t
。需要澄清的t
是,这是t
句子中的最后一个。
"c.+t" => The fat cat sat on the mat.
测试正则表达式
在正则表达式中,元字符?
使前面的字符成为可选字符。该符号与前一个字符的零个或一个实例匹配。例如,正则表达式的[T]?he
意思是:可选的大写字母T
,后跟小写字符h
,再跟小写字符e
。
"[T]he" => The car is parked in the garage.
测试正则表达式
"[T]?he" => The car is parked in the garage.
测试正则表达式
在正则表达式中,花括号(也称为量词)用于指定一个字符或一组字符可以重复的次数。例如,正则表达式的[0-9]{2,3}
意思是:匹配至少2位但不超过3位(0到9之间的字符)。
"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
测试正则表达式
我们可以省略第二个数字。例如,正则表达式[0-9]{2,}
表示:匹配2个或更多数字。如果我们也删除逗号,则正则表达式[0-9]{3}
表示:精确匹配3位数字。
"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
测试正则表达式
"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
测试正则表达式
字符组是写在括号内的一组子模式(...)
。正如我们之前在正则表达式中讨论的那样,如果我们在一个字符之后放置一个量词,那么它将重复前面的字符。但是,如果我们将量词放在一个字符组之后,那么它将重复整个字符组。例如,正则表达式(ab)*
匹配字符“ ab”的零个或多个重复。我们还可以|
在字符组中使用替代元字符。例如,正则表达式(c|g|p)ar
的装置:小写字符c
,g
或p
,随后的字符a
,随后的字符r
。
"(c|g|p)ar" => The car is parked in the garage.
测试正则表达式
在正则表达式中,竖线|
用于定义交替。交替就像多个表达式之间的条件。现在,你可能会认为字符集和替换的工作方式相同。但是字符集和替换之间的最大区别是,字符集在字符级别上起作用,而替换在表达式级别上起作用。例如,正则表达式(T|t)he|car
意思是:大写字母T
或小写字母t
,其次是小写字母h
,然后是小写字母e
或小写字母c
,接着是小写字母a
,再是小写字母r
。
"(T|t)he|car" => The car is parked in the garage.
测试正则表达式
\
正则表达式中使用反斜杠来转义下一个字符。这允许将符号指定为包含保留字符的匹配字符{ } [ ] / \ + * . $ ^ | ?
。要将特殊字符用作匹配字符放在前面\
。例如,正则表达式.
用于匹配除换行符以外的任何字符。现在,以匹配.
在一个输入字符串的正则表达式(f|c|m)at\.?
的装置:小写字母f
,c
或者m
,随后小写字符a
,接着小写字母t
,接着可选.
字符。
"(f|c|m)at\.?" => The fat cat sat on the mat.
测试正则表达式
在正则表达式中,我们使用锚点来检查匹配的符号是输入字符串的开始符号还是结束符号。锚有两种类型:第一种类型是Caret ^
,它检查匹配的字符是否是输入的起始字符,第二种类型是Dollar $
,它检查匹配的字符是否是输入字符串的最后一个字符。
插入^
符号用于检查匹配字符是否为输入字符串的第一个字符。如果我们将以下正则表达式^a
(如果a是起始符号)应用于输入字符串,abc
则它匹配a
。但是,如果我们^b
在上述输入字符串上应用正则表达式,则它不匹配任何内容。因为在输入字符串中,abc
“ b”不是起始符号。让我们看一下另一个正则表达式^(T|t)he
,它表示:大写字符T
或小写字符t
是输入字符串的开始符号,其后是小写字符h
,再是小写字符e
。
"(T|t)he" => The car is parked in the garage.
测试正则表达式
"^(T|t)he" => The car is parked in the garage.
测试正则表达式
美元$
符号用于检查匹配字符是否为输入字符串的最后一个字符。例如,正则表达式(at\.)$
表示:小写字符a
,后跟小写字符t
,后跟一个.
字符,匹配器必须在字符串的结尾。
"(at\.)" => The fat cat. sat. on the mat.
测试正则表达式
"(at\.)$" => The fat cat. sat. on the mat.
测试正则表达式
正则表达式为常用字符集提供了快捷方式,而后者为常用正则表达式提供了方便的快捷方式。速记字符集如下:
速记 | 描述 |
---|---|
。 | 除换行外的任何字符 |
\ w | 匹配字母数字字符: [a-zA-Z0-9_] |
\ W | 匹配非字母数字字符: [^\w] |
\ d | 匹配数字: [0-9] |
\ D | 匹配非数字: [^\d] |
\ s | 匹配空白字符: [\t\n\f\r\p{Z}] |
\ S | 匹配非空格字符: [^\s] |
后向和前向有时称为环视,是非捕获组的特定类型(用于匹配模式,但不包括在匹配列表中)。当我们具有该模式在另一个特定
模式之前或之后的条件时,将使用前行。例如,我们$
要从下面的输入字符串中获取所有以字符开头的数字$4.44 and $10.88
。我们将使用以下正则表达式(?<=\$)[0-9\.]*
,这意味着:获取所有包含.
字符并以$
字符开头的数字。以下是在正则表达式中使用的环顾:
符号 | 描述 |
---|---|
?= | 积极向前 |
?! | 负前瞻 |
?<= | 正向后看 |
?<! | 负向后看 |
正向超前断言,表达式的第一部分必须后跟超前表达式。返回的匹配项仅包含与表达式的第一部分匹配的文本。为了定义正向,使用括号。在这些括号内,使用等号问号,如下所示:(?=...)
。先行表达式写在括号内的等号之后。例如,正则表达式的[T|t]he(?=\sfat)
意思是:可选地匹配小写字母t
或大写字母T
,后跟字母h
,再跟字母e
。在括号中,我们定义了正向前行,它告诉正则表达式引擎匹配The
或the
后面跟有单词fat
。
"[T|t]he(?=\sfat)" => The fat cat sat on the mat.
测试正则表达式
当我们需要从输入字符串中获取没有模式跟随的所有匹配项时,可以使用Negative lookahead。与我们定义积极前向一样,唯一的区别是我们使用了否定词代替=字符!性格即(? !…)。让我们看一下下面的正则表达式[T| T]he(?!\sfat),它的意思是:从输入字符串中获取所有没有在单词fat后面加上空格字符的单词。
"[T|t]he(?!\sfat)" => The fat cat sat on the mat.
测试正则表达式
正向后查找用于获取特定模式之前的所有匹配项。积极的后向表示
(? < =…)。例如,正则表达式(?<=[T| T]he\s)(fat|mat)表示:从单词the或the后面的输入字符串中获取所有fat或mat单词。
"(?<=[T|t]he\s)(fat|mat)" => The fat cat sat on the mat.
测试正则表达式
Negative lookbehind用于获取没有特定模式的所有匹配项。负后向表示(? < !……)。例如,正则表达式(?
"(? The cat sat on cat.
测试正则表达式
标志也称为修饰符,因为它们会修改正则表达式的输出。这些标志可以以任何顺序或组合使用,并且是RegExp的组成部分。
旗 | 描述 |
---|---|
一世 | 不区分大小写:将匹配设置为不区分大小写。 |
G | 全局搜索:在整个输入字符串中搜索模式。 |
米 | 多行:锚元字符在每行上起作用。 |
所述i
改性剂被用于执行不区分大小写匹配。例如,正则表达式的/The/gi
意思是:大写字母T
,后跟小写字符h
,后跟character e
。并且在正则表达式的末尾,该i
标志告诉正则表达式引擎忽略大小写。如您所见,我们还提供了g
flag,因为我们想在整个输入字符串中搜索模式。
"The" => The fat cat sat on the mat.
测试正则表达式
"/The/gi" => The fat cat sat on the mat.
测试正则表达式
该g
修改器用于执行全局匹配(查找所有的比赛,而不是第一场比赛后停止)。例如,正则表达式/.(at)/g
表示:除换行符外的任何字符,后跟小写字符a
,再跟小写字符t
。因为我们g
现在在正则表达式的末尾提供了flag,所以它将从整个输入字符串中查找所有匹配项。
"/.(at)/" => The fat cat sat on the mat.
测试正则表达式
"/.(at)/g" => The fat cat sat on the mat.
测试正则表达式
所述m
改性剂被用于执行多线的匹配。正如我们前面讨论的,锚点(^, $)
用于检查pattern是输入的开始还是输入字符串的结尾。但是,如果我们希望锚在每一行上都起作用,则可以使用m
flag。例如,正则表达式的/at(.)?$/gm
意思是:小写字符a
,后跟小写字符t
,除了换行符以外的其他任意内容。而且由于m
有了标志,正则表达式引擎现在在字符串的每一行末尾匹配模式。
"/.at(.)?$/" => The fat
cat sat
on the mat.
测试正则表达式
"/.at(.)?$/gm" => The fat
cat sat
on the mat.
测试正则表达式
原文链接:https://dev.to//ziishaned/learn-regex-the-easy-way-c4g