企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
# 特殊符号 **原子**:就是放到定界符中的字母数字等要匹配的字符如/love/ 里边的love就是原子 即字符串中有love才能匹配, **自定义原子表 \[ \]** 里边的原子都是或者的关系 如上边的/love/是**并且**的意思即『先匹配l有的话在匹配l后是否有o前两个都有在匹配o后边是不是有v,然后lov都成立再见车lov后边是不是有e这4个有一个不成立都不会被匹配,』 so表示必须要匹配整体的love的字符;而/\[love\]/表示只要匹配的字符串里有单个的l,o,v或者e都会被匹配出来是或者的意思 > 在正则表达式中最少要有一个原子 **元字符:在定界符里的所有特殊字符都是元字符** **`. \ * + ?  ^ $  {n} {n,} {n,m} [] ()  [^] | [-]`** [元字符总表](https://www.cnblogs.com/lichihua/diary/2019/07/07/11145131.html) **限定符:重复** 如果说你想匹配连续5个数字怎么办,写五个/d太麻烦了吧,事实上我们肯定不会那么做?我们可以使用/d{5}. 常用的表示重复的符号如下表: 字符 说明 \* 重复0到多次 + 重复1到多次 ? 重复零次或一次 {n} 重复n次 {n, 重复n到多次 {n,m} 重复n到m次 **懒惰限定符:?** 如果有a.\*b正则表达式,有字符accccbccb去匹配,达到的是accccbccb还是accccb呢?答案是前者,会找最长的。但是有时我们不希望这样,就可以使用懒惰限定符。比如上面的正则表达式可以这样a.\*?b就可以解决问题了 字符 说明 \*? 重复0到多次,但尽可能少的重复 代表(.\*?) +? 重复1到多次,但尽可能少的重复 ?? 重复0到一次,但尽可能少的重复 {n,m}? 重复n到m次,但尽可能少的重复 {n}? 重复n到多次,但尽可能少的重复 **`.*`** 就是单个字符匹配任意次 **`.*?`** 是满足条件的情况只匹配一次,即最小匹配 ### **常见元字符详细用法:** **模式中方括号外任何地方使用的** \\ 一般用于转义字符 ``` <pre class="calibre10">``` <span class="token2">"/\?\\n/"</span> ``` ``` ^ 断言目标的开始位置(或在多行模式下是行首) ``` <pre class="calibre10">``` <span class="token2">"/^hell/"</span> <span class="token">//必须以hell开头的字符串相匹配 如:“hell”, “hello” “hellhound”</span> ``` ``` $ 断言目标的结束位置(或在多行模式下是行尾) ``` <pre class="calibre10">``` <span class="token2">"/ar$/"</span> <span class="token">//必须以ar结尾的字符串相匹配 如:“car”, “bar”或 “ar”</span> <span class="token1">^</span>abc$ <span class="token">//就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配;</span> ``` ``` **`.`** 匹配除换行符外的任何字符(默认) 要匹配包括“\\n”在内的任何字符,请使用像“\[\\s\\S\]”的模式。 ``` <pre class="calibre10">``` <span class="token2">"/(.)/"</span> 可以代表所有的单一字符,不包括<span class="token2">"\n"</span> <span class="token">//如果,要匹配包括"\n"在内的所有单个字符,怎么办? 用'[\n.]'这种模式。</span> <span class="token2">"a.[0-9]"</span> <span class="token3">:</span>一个a加一个字符再加一个<span class="token6">0</span>到<span class="token6">9</span>的数字; <span class="token2">"^.{3}$"</span> <span class="token3">:</span>三个任意字符结尾。 ``` ``` \[ 开始字符类定义 \] 结束字符类定义 ``` <pre class="calibre10">``` <span class="token2">"/[0-9a-Z]+/"</span> 注意:在中括号里面,所有的特殊字符,包括<span class="token3">(</span><span class="token2">''</span><span class="token3">)</span>,都将失去他们的特殊性质 <span class="token2">"[*\+?{}.]"</span> 匹配含有这些字符的字符串: "如果列表里含有<span class="token2">']'</span>,最好把它作为列表里的第一个字符<span class="token3">(</span>可能跟在<span class="token2">'^'</span>后面<span class="token3">)</span>。如果含有<span class="token2">'-'</span>,最好把它放在最前面或者最后面,or或者一个范围的第二个结束点<span class="token3">[</span>a<span class="token1">-</span>d<span class="token1">-</span><span class="token6">0</span><span class="token1">-</span><span class="token6">9</span><span class="token3">]</span>中间的‘<span class="token1">-</span>’将有效。 ``` ``` | 开始一个可选分支 ``` <pre class="calibre10">``` <span class="token2">"/a|b|c/"</span> 同 <span class="token2">"/[abc]/"</span> <span class="token2">"hi|hello"</span><span class="token3">:</span>匹配含有<span class="token2">"hi"</span>或者<span class="token2">"hello"</span>的 字符串; <span class="token2">"(b|cd)ef"</span><span class="token3">:</span>匹配含有<span class="token2">"bef"</span>或者<span class="token2">"cdef"</span>的字符串; <span class="token2">"(a|b)*c"</span><span class="token3">:</span>匹配含有这样多个(包括<span class="token6">0</span>个)a或b,后面跟一个c的字符串; ``` ``` ( 子组的开始标记 ) 子组的结束标记 ``` <pre class="calibre10">``` <span class="token2">"/(ab)|c/"</span> ``` ``` > 要点:'\*' '+' 和 '?' 只管它前面那个字符。 **`?`** 作为量词,表示 0 次或 1 次匹配。位于量词后面用于改变量词的贪婪特性。 (查阅量词) ``` <pre class="calibre10">``` <span class="token2">"/[0-9a-Z]?/"</span> 同 <span class="token2">"/[0-9a-Z]{0,1}/"</span> ``` ``` **`*`** 量词,0 次或多次匹配 ``` <pre class="calibre10">``` <span class="token2">"/[0-9a-Z]*/"</span> 同 <span class="token2">"/[0-9a-Z]{0,}/"</span> <span class="token">//只针对原子最后那个字符</span> <span class="token1">/</span>fo<span class="token1">*</span><span class="token1">/</span> <span class="token">//可匹配 f fo foo fooo... 如conf info football full shuff </span> ``` ``` **`+`** 量词,1 次或多次匹配 ``` <pre class="calibre10">``` <span class="token2">"/[0-9a-Z]+/"</span> 同 <span class="token2">"/[0-9a-Z]{1,}/"</span> <span class="token">//只针对原子最后那个字符</span> <span class="token1">/</span>fo<span class="token1">+</span><span class="token1">/</span> <span class="token">//可匹配 fo foo fooo... 如info football </span> ``` ``` { 自定义量词开始标记 } 自定义量词结束标记 ``` <pre class="calibre10">``` <span class="token2">"/[0-9a-Z]{1}/"</span> <span class="token">//匹配1次</span> <span class="token2">"/[0-9a-Z]{1,}/"</span> <span class="token">//至少匹配*n*次</span> <span class="token2">"/[0-9a-Z]{3,9}+/"</span> <span class="token">//匹配3~9次</span> <span class="token2">"a(bc){1,5}"</span> <span class="token">//a一个到5个"bc";</span> ``` ``` **模式中方括号内** 模式中方括号内的部分称为“字符类”。 在一个字符类中仅有以下可用元字符: \\ 转义字符 ``` <pre class="calibre10">``` <span class="token2">"/[\?\}]+/"</span> ``` ``` ^ 仅在作为第一个字符(方括号内)时,表明字符类取反 ``` <pre class="calibre10">``` <span class="token2">"/[^abc]+/"</span> ``` ``` \- 标记字符范围 ``` <pre class="calibre10">``` <span class="token2">"/[0-9]/"</span> ``` ``` - - - - - - - - - - - - **`\b`** 匹配一个单词边界 例如,“er\\b” 以er结束 可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。 `/\bbom/` 以 “bomb”,或 “bom”开头的字符串相匹配 **`\B`** 匹配非单词边界。“er\\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 **`\d`** 匹配一个数字字符。等价于\[0-9\] **`\D`** 匹配一个非数字字符。等价于\[^0-9\] **`\s` \*\* 匹配任何**不可见字符\*\*,包括空格、制表符、换页符等等。等价于\[ \\f\\n\\r\\t\\v\] **`\S` \*\* 匹配任何**可见字符\*\*。等价于\[^ \\f\\n\\r\\t\\v\] **`\w`** 匹配包括下划线的任何**单词字符**。这里的"单词"字符使用Unicode字符集。 \\d类似但不等价于“\[A-Za-z0-9\_\]”, \[A-Za-z0-9\_\]只能匹配 英文字母下划线和数字 而\\w能匹配俄文等其他国家的字符如:"аdmin"会被\\w匹配其中а是俄文字母 `/^\[A-Za-z0-9\u4E00-\u9FA5-]{2,16}$/`只允许数字、英文字母大小写、中文 **`\W`** 匹配任何**非单词字符**。等价于“\[^A-Za \\f 匹配一个换页符。等价于\\x0c和\\cL。 **`\r`** 匹配一个回车符。等价于\\x0d和\\cM **`\n`** 匹配一个换行符。等价于\\x0a和\\cJ - - - - - - - - - - - - \\t 匹配一个制表符。等价于\\x09和\\cI \\v 匹配一个垂直制表符。等价于\\x0b和\\cK -z0-9\_\]” \\cx 匹配由x指明的控制字符。例如,\\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符 \\x*n* 匹配*n*,其中*n*为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\\x41”匹配“A”。“\\x041”则等价于“\\x04&1”。正则表达式中可以使用ASCII编码 \\*num* 匹配*num*,其中*num*是一个正整数。对所获取的匹配的引用。例如,“(.)\\1”匹配两个连续的相同字符,同(.)(.)。又如:(.)(\\?)(.)\\2 同(.)(\\?)(.)(\\?) \\*n* 标识一个八进制转义值或一个向后引用。如果\\*n*之前至少*n*个获取的子表达式,则*n*为向后引用。否则,如果*n*为八进制数字(0-7),则*n*为一个八进制转义值 \\*nm* 标识一个八进制转义值或一个向后引用。如果\\*nm*之前至少有*nm*个获得子表达式,则*nm*为向后引用。如果\\*nm*之前至少有*n*个获取,则*n*为一个后跟文字*m*的向后引用。如果前面的条件都不满足,若*n*和*m*均为八进制数字(0-7),则\\*nm*将匹配八进制转义值*nm*。 \\*nml* 如果*n*为八进制数字(0-7),且*m*和*l*均为八进制数字(0-7),则匹配八进制转义值*nml*。 \\u*n* 匹配*n*,其中*n*是一个用四个十六进制数字表示的Unicode字符。例如,\\u00A9匹配版权符号(©)。 \\p{P} 参看下列 ``` <pre class="calibre10">``` 小写 p 是 property 的意思,表示 Unicode 属性,用于 Unicode 正表达式的前缀。中括号内的“P”表示Unicode 字符集七个字符属性之一:标点字符。 其他六个属性: L:字母; M:标记符号(一般不会单独出现); Z:分隔符(比如空格、换行等); S:符号(比如数学符号、货币符号等); N:数字(比如阿拉伯数字、罗马数字等); C:其他字符。 注:此语法部分语言不支持,例:javascript。 ``` ``` - - - - - - 断言:详情见断言章节 (pattern) (?:pattern) (?=pattern) (?!pattern) (?<=pattern) (?<!pattern)