用AI赚第一桶💰低成本搭建一套AI赚钱工具,源码可二开。 广告
**原子**:就是放到定界符中的字母数字等要匹配的字符如/love/ 里边的love就是原子 即字符串中有love才能匹配, **自定义原子表 \[ \]** 里边的原子都是或者的关系  如上边的/love/是**并且**的意思即『先匹配l有的话在匹配l后是否有o前两个都有在匹配o后边是不是有v,然后lov都成立再见车lov后边是不是有e这4个有一个不成立都不会被匹配,』 so表示必须要匹配整体的love的字符;而/\[love\]/表示只要匹配的字符串里有单个的l,o,v或者e都会被匹配出来是或者的意思 >[danger]在正则表达式中最少要有一个原子 **元字符:在定界符里的所有特殊字符都是元字符** **`. \ * + ?  ^ $  {n} {n,} {n,m} [] ()  [^] | [-]`** [元字符总表](https://www.cnblogs.com/lichihua/diary/2019/07/07/11145131.html) **限定符:重复** 如果说你想匹配连续5个数字怎么办,写五个/d太麻烦了吧,事实上我们肯定不会那么做?我们可以使用/d{5}. 常用的表示重复的符号如下表: <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top"> <p>字符</p> </td> <td valign="top"> <p>说明</p> </td> </tr> <tr> <td valign="top"> <p>*</p> </td> <td valign="top"> <p>重复0到多次</p> </td> </tr> <tr> <td valign="top"> <p>+</p> </td> <td valign="top"> <p>重复1到多次</p> </td> </tr> <tr> <td valign="top"> <p>?</p> </td> <td valign="top"> <p>重复零次或一次</p> </td> </tr> <tr> <td valign="top"> <p>{n}</p> </td> <td valign="top"> <p>重复n次</p> </td> </tr> <tr> <td valign="top"> <p>{n,</p> </td> <td valign="top"> <p>重复n到多次</p> </td> </tr> <tr> <td valign="top"> <p>{n,m}</p> </td> <td valign="top"> <p>重复n到m次</p> <p>&nbsp;</p> </td> </tr> </tbody> </table> **懒惰限定符:?**  如果有a.\*b正则表达式,有字符accccbccb去匹配,达到的是accccbccb还是accccb呢?答案是前者,会找最长的。但是有时我们不希望这样,就可以使用懒惰限定符(也就是匹配尽可能少的字符)。比如上面的正则表达式可以这样a.\*?b就可以解决问题了 <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top"> <p>字符</p> </td> <td valign="top"> <p>说明</p> </td> </tr> <tr> <td valign="top"> <p>*?</p> </td> <td valign="top"> <p>重复0到多次,但尽可能少的重复 代表(.*?)</p> </td> </tr> <tr> <td valign="top"> <p>+?</p> </td> <td valign="top"> <p>重复1到多次,但尽可能少的重复</p> </td> </tr> <tr> <td valign="top"> <p>??</p> </td> <td valign="top"> <p>重复0到一次,但尽可能少的重复</p> </td> </tr> <tr> <td valign="top"> <p>{n,m}?</p> </td> <td valign="top"> <p>重复n到m次,但尽可能少的重复</p> </td> </tr> <tr> <td valign="top"> <p>{n}?</p> </td> <td valign="top"> <p>重复n到多次,但尽可能少的重复</p> </td> </tr> </tbody> </table> 例: ``` \s* // 一直匹配尽可能多的空白字符 .*?\s //惰性匹配 .* 代表任意非空白字符,直到遇到第一个空白字符停止匹配 ``` **`.`** 匹配任意除换行符“\\n”外的字符 **`.*`** 就是单个字符匹配任意次 **`.*?`** 是满足条件的情况只匹配一次,即最小匹配 ### **常见元字符详细用法:** **模式中方括号外任何地方使用的** \ 一般用于转义字符 ``` "/\?\\n/" ``` ^ 断言目标的开始位置(或在多行模式下是行首) ``` "/^hell/" //必须以hell开头的字符串相匹配 如:“hell”, “hello” “hellhound” ``` $ 断言目标的结束位置(或在多行模式下是行尾) ``` "/ar$/" //必须以ar结尾的字符串相匹配 如:“car”, “bar”或 “ar” ^abc$ //就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配; ``` ^放在[]里时表示排除 find(?!pattern) 正向否定预搜索find的右边不是pattern的字符 (?<!pattern)find 反向否定预搜索find的左边不是pattern的字符 **以(?<=pattern)xxx为例,就是捕获xxx右边的内容没有pattern的xxx** **以(?<!pattern)xxx为例,就是捕获xxx左边的内容没有pattern的xxx** 匹配不包含abc的内容: ``` ^(?!.*abc).*$ ``` 表示匹配的字符串不包含and且不包含空白字符 ~~~ (?:(?!and)[^\s])* ~~~ **`. `** 匹配除换行符外的任何字符(默认) 要匹配包括“\\n”在内的任何字符,请使用像“[\s\S]”的模式。 ``` "/(.)/" 可以代表所有的单一字符,不包括"\n" //如果,要匹配包括"\n"在内的所有单个字符,怎么办? 用'[\n.]'这种模式。 "a.[0-9]" :一个a加一个字符再加一个0到9的数字; "^.{3}$" :三个任意字符结尾。 ``` [ 开始字符类定义 ] 结束字符类定义 ``` "/[0-9a-Z]+/" 注意:在中括号里面,所有的特殊字符,包括(''),都将失去他们的特殊性质 "[*\+?{}.]"    匹配含有这些字符的字符串: "如果列表里含有']',最好把它作为列表里的第一个字符(可能跟在'^'后面)。如果含有'-',最好把它放在最前面或者最后面,or或者一个范围的第二个结束点[a-d-0-9]中间的‘-’将有效。 ``` | 开始一个可选分支 ``` "/a|b|c/" 同 "/[abc]/" "hi|hello":匹配含有"hi"或者"hello"的 字符串; "(b|cd)ef":匹配含有"bef"或者"cdef"的字符串; "(a|b)*c":匹配含有这样多个(包括0个)a或b,后面跟一个c的字符串; ``` ( 子组的开始标记 ) 子组的结束标记 ``` "/(ab)|c/" ``` >[danger]要点:'\*' '+' 和 '?' 只管它前面那个字符。 **`?`** 作为量词,表示 0 次或 1 次匹配。位于量词后面用于改变量词的贪婪特性。 (查阅量词) ``` "/[0-9a-Z]?/" 同 "/[0-9a-Z]{0,1}/" ``` **`*`** 量词,0 次或多次匹配 ``` "/[0-9a-Z]*/" 同 "/[0-9a-Z]{0,}/" //只针对原子最后那个字符 /fo*/ //可匹配 f fo foo fooo... 如conf info football full shuff ``` **`+`** 量词,1 次或多次匹配 ``` "/[0-9a-Z]+/" 同 "/[0-9a-Z]{1,}/" //只针对原子最后那个字符 /fo+/ //可匹配 fo foo fooo... 如info football ``` { 自定义量词开始标记 } 自定义量词结束标记 ``` "/[0-9a-Z]{1}/" //匹配1次 "/[0-9a-Z]{1,}/" //至少匹配*n*次 "/[0-9a-Z]{3,9}+/" //匹配3~9次 "a(bc){1,5}" //a一个到5个"bc"; ``` **模式中方括号内** 模式中方括号内的部分称为“字符类”。 在一个字符类中仅有以下可用元字符: \ 转义字符 ``` "/[\?\}]+/" ``` ^ 仅在作为第一个字符(方括号内)时,表明字符类取反 ``` "/[^abc]+/" ``` \- 标记字符范围 ``` "/[0-9]/" ``` ***** ***** **`\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字符集。            类似但不等价于“\[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匹配版权符号(&copy;)。 \\p{P} 参看下列 ``` 小写 p 是 property 的意思,表示 Unicode 属性,用于 Unicode 正表达式的前缀。中括号内的“P”表示Unicode 字符集七个字符属性之一:标点字符。 其他六个属性: L:字母; M:标记符号(一般不会单独出现); Z:分隔符(比如空格、换行等); S:符号(比如数学符号、货币符号等); N:数字(比如阿拉伯数字、罗马数字等); C:其他字符。 注:此语法部分语言不支持,例:javascript。 ``` ***** 断言:详情见断言章节 (pattern) (?:pattern) (?=pattern) (?!pattern) (?<=pattern) (?<!pattern)