一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列匹配某个句法规则的字符串。例如:Handel、Händel和Haendel这三个字符串,都可以由H(a|ä|ae)ndel
这个模式来描述。大部分正则表达式的形式都有如下的结构:
-
选择
竖线|代表选择(即或集),具有最低优先级。例如gray|grey可以匹配grey或gray。 -
数量限定
某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括+、?和*(不加数量限定则代表出现一次且仅出现一次):- 加号+代表前面的字符必须至少出现一次。(1次或多次)。例如,goo+gle可以匹配google、gooogle、goooogle等;
- 问号?代表前面的字符最多只可以出现一次。(0次或1次)。例如,colou?r可以匹配color或者colour;
- 星号代表前面的字符可以不出现,也可以出现一次或者多次。(0次、1次或多次)。例如,042可以匹配42、042、0042、00042等。很常见的
.*
就用来匹配任意长度的任意字符串,它实际上等价于任意个.
-
匹配
圆括号()可以用来定义操作符的范围和优先度。例如,gr(a|e)y等价于gray|grey,(grand)?father匹配father和grandfather。
上述这些构造子都可以自由组合
常见正则语法
-
\
转义 -
^
匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,也匹配“\n”或“\r”之后的位置 -
$
匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置 -
?
前面的字符最多只可以出现一次, or非贪心量化(Non-greedy quantifiers):当该字符紧跟在任何一个其他重复修饰符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o” -
(?:pattern)
非获取匹配(也就是,匹配结果不会获取group)
匹配pattern但不获取匹配命中的子字符串(shy groups),也就是说这是一个非获取匹配,不存储匹配的子字符串用于向后引用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式,字符串"there is an industry, see!"去匹配patternindustr(?:y|ies)
,会得到一个match: "industry", 但不会得到group: "y" -
pattern1(?=pattern2)
正向肯定预查(look ahead positive assert,也是一种非获取匹配)
表示pattern1后边必须马上紧接pattern2,(?=pattern2)
只作为筛选条件而不作为结果
字符串"there is an industry, see!"去匹配patternindustr(?=y|ies)
,会得到一个match: "industr", 但不会得到group: "y"。更多非获取匹配,可以参考https://javascript.info/regexp-lookahead-lookbehind
网友评论