diff --git "a/\345\267\245\345\205\267/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" "b/\345\267\245\345\205\267/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" index b3b38cc66e83f40f69773c7e58517ab71b2074ef..fead75b22609de8c4c45cb4a0a66e6fa5cd00ee4 100644 --- "a/\345\267\245\345\205\267/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" +++ "b/\345\267\245\345\205\267/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" @@ -227,7 +227,7 @@ str.replace(reg,"--$1--"); //"--asd123--asd123" - 由数字、26个英文字母或者下划线组成的字符串:`^\w+$ 或 ^\w{3,20}$` - 中文、英文、数字包括下划线:`^[\u4E00-\u9FA5A-Za-z0-9_]+$` - 中文、英文、数字但不包括下划线等符号:`^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$` -- 可以输入含有^%&',;=?$\"等字符:`[^%&',;=?$\x22]+` +- 可以输入含有 ^%&',;=?$“ 等字符:`[^%&',;=?$\x22]+` - 禁止输入含有~的字符:`[^~\x22]+` ------ @@ -306,5 +306,5 @@ str.replace(reg,"--$1--"); //"--asd123--asd123" 1. [Java 正则表达式](https://www.runoob.com/java/java-regular-expressions.html) 2. [正则表达式 - 语法](https://www.runoob.com/regexp/regexp-syntax.html) -3. Regex 正则表达式中几个符号([ ] ^ {} ?: ?= ?!)的概念 . https://www.jianshu.com/p/9c4979a3b7e4 -4. 正则表达式——“?”的几种用法 https://blog.csdn.net/qq_37683835/article/details/88601721 \ No newline at end of file +3. [Regex 正则表达式中几个符号的概念](https://www.jianshu.com/p/9c4979a3b7e4) +4. [正则表达式——“?”的几种用法](https://blog.csdn.net/qq_37683835/article/details/88601721) \ No newline at end of file diff --git "a/\345\267\245\345\205\267/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217_wp.md" "b/\345\267\245\345\205\267/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217_wp.md" new file mode 100644 index 0000000000000000000000000000000000000000..8a636fe8a9006c5b11843b5ad8682b097f3b291c --- /dev/null +++ "b/\345\267\245\345\205\267/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217_wp.md" @@ -0,0 +1,312 @@ +> 正则表达式是编程中常用的校验和过滤字符的手段,本文主要讲解 正则表达式基础、一些特殊用法和常用到的正则表达式案例。 + +# 正则表达式基础 + +## 基础知识 + +**1. 方括号`[ ]`只能匹配一个字符,称为:字符类 或 字符簇。** + 其中连字号`-`在`[ ]`中使用时表示一个字符的范围。 + + Example: + + ```json + [a-z] // 匹配所有的小写字母 + [A-Z] // 匹配所有的大写字母 + [a-zA-Z] // 匹配所有的字母 + [0-9] // 匹配所有的数字 + [0-9\.\-] // 匹配所有的数字、句号、减号 + [ \n\f\r\t\v] // 匹配所有的空白字符(空格、换行符、换页符、回车符、水平制表符、垂直制表符) + ``` + +**2. `^`除了表示字符串的开头,还有另外一个含义,即当在一组方括号里使用`^`时,它表示”非”或”排除”的意思,常常用来剔除某个字符。** + + Example: + + ```json + [^a-z] // 匹配除了小写字母以外的所有字符 + [^\\\/\^] // 匹配除了\ / ^之外的所有字符 + [^\”\’] // 匹配除了双引号和单引号之外的所有字符 + ``` + +**3. 限定符** + 花括号`{}`跟在字符或字符簇后面,用来确定前面的内容重复出现的次数,称为限定符。 + `{3}` 表示:前面的字符或字符簇只出现3次; + `{3,}` 表示:前面的字符或字符簇出现3次或更多次; + `{3,5}` 表示:前面的字符或字符簇出现至少3次,至多5次; + 除了`{}`,还有其他的限定符,如: + `*`:重复0次或多次,等价于:`{0,}` + `+`:重复1次或多次,等价于:`{1,}` + `?`:重复0次或1次,等价于:`{0,1}` + `|`:指明两项之间的一个选择,要匹配`|`,请使用`\|` + + Example: + + ```cpp + ^[0-9]{1,}$ // 匹配所有的正数 + ^[0-9]+$ // +与{1,}相等,表示前面的内容可以是1个或多个 + ^\-{0,1}[0-9]{1,}$ // 匹配所有的整数 + ^\-?[0-9]+$ + ^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ // 匹配所有小数的正则 + ^\-?[0-9]{0,}\.?[0-9]{0,}$ // ?与{0,1}相等,表示前面的内容是可选的 + ^\-?[0-9]*\.?[0-9]*$ // *与{0,}相等,表示前面的内容可以是0个或多个 + ``` + + > 如果在限定符`*、+、?、{n}、{n,}、{n,m}`之后再添加一个字符`?`,则表示尽可能少地重复字符`?`之前的限定符的重复次数,这种匹配方式称为懒惰匹配。与之相对应的是贪婪匹配,即仅仅使用单个限定符`*、+、?、{n}、{n,}、{n,m}`的匹配。 + +**4. 元字符** + - 匹配位置的元字符 + `^` 匹配行的开始位置 + `$` 匹配行的结束位置 + `\b` 匹配单词的开始或结束位置 + - 匹配字符的元字符 + `.` 匹配除换行符之外的任意字符 + `\d` 匹配一个数字字符,等价于`[0-9]` + `\D` 匹配一个非数字字符,等价于`[^0-9]` + `\w` 匹配任何单词字符(包括字母、数字、下划线),等价于`[a-zA-Z0-9_]` + `\W` 匹配任何非单词字符,等价于`[^a-zA-Z0-9_]` + `\s` 匹配任何空白字符,包括空格、换行符、换页符、回车符、水平制表符、垂直制表符,等价于`[ \n\f\r\t\v]` + `\S` 匹配任何非空白字符,即不包含空格、换行符、换页符、回车符、水平制表符、垂直制表符,等价于`[^ \n\f\r\t\v]` + `\b` 匹配一个单词边界,也就是指单词和空格间的位置。 例如:er\b可以匹配”never”中的”er”,但不能匹配”verb”中的”er" + `\B` 匹配非单词边界。 例如:`er\B`可以匹配”verb”中的”er”,但不能匹配”never”中的”er” + + Example: + + ```ruby + ^.{3}$ 只能输入长度为3的字符 + ^[a-zA-Z0-9]+$ 只能输入由数字、字母组成的字符串 + ^\w+$ 只能输入由数字、字母、下划线三种单词字符组成的字符串 + (\w)\1 匹配两个重叠出现的字符,其中\1表示对所获取匹配的引用。 + 例如: “aabbc11ads”,匹配结果为三组”aa”、“bb”、“11”的match。 + 在第一次匹配过程中,\1就表示了对匹配字符a的引用,因此对连续出现的a匹配成功; + 若改为(\w)\1\1时,则可匹配连续出现三次的字符,如”aaabccc2sa”中的”aaa”和“ccc”。 + ``` + +## "?"的几种用法 + * "?"元字符规定其前导对象必须在目标对象中连续出现零次或一次。 + * 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串"oooo","o+?"将匹配单个"o",而"o+"将匹配所有"o"。 + * (?:pattern) ——匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符"(|)"来组合一个模式的各个部分是很有用。例如"industr(?:y|ies)"就是一个比"industry|industries"更简略的表达式。 + * (?=pattern)——正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 + * (?!pattern)——正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 + * (?<=pattern)——反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。 + * (? `(?=expression)`可理解为:匹配字符串expression前面的位置。 + +`Swift(?!4)` 匹配右边不跟着4的Swift; +其中`(?!)`称为:正向预查不匹配,`(?!4)`表示先看看有没有4,如果没有,也即不等于4的情况,则把左边的Swift匹配出来;如果有,则继续向右查看,这个过程就是正向预查不匹配。 + +> `(?!expression)`可理解为:匹配后面不是字符串expression的位置。 + +`(?<=4)Swift` 匹配左边紧跟着4的Swift,即第五个Swift单词,索引为26到30的字符; +其中`(?<=)`称为:反向预查匹配,`(?<=4)`表示先看看有没有4,如果有,则把4右边的Swift匹配出来;如果没有,则继续向右查看,这个过程就是反向预查匹配。 + +> `(?<=expression)`可理解为:匹配字符串expression后面的位置。 + +`(? `(?]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$ 或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)` +- 腾讯QQ号:`[1-9][0-9]{4,} (腾讯QQ号从10000开始)` +- 中国邮政编码:`[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)` +- IP地址:`((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))` +- IP地址:`[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}` +- 密码 + - 强密码 (必须包含数字、小写字母和大写字母三种字符,即这三种字符的组合,且不能使用特殊字符,长度在8-16之间) + ```ruby + ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$ + ``` + - 强密码 (必须包含数字和字母两种字符,即数字和字母的组合,且不能使用特殊字符,长度在8-16之间)。 + ```ruby + ^(?=.*[0-9])(?=.*[a-zA-Z])[0-9a-zA-Z]{8,16}$ + ``` + - 强密码 (必须包含数字、小写字母、大写字母和特殊字符四种字符,即这四种字符的组合,其中特殊字符为除数字、小写字母、大写字母以外的其他字符,长度在8-16之间)。 + ```ruby + ^(?:(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[^0-9a-zA-Z])).{8,16}$ + ``` +- 匹配以两个相同字母结尾的单词,如:zoo、success、all等。 + ```css + \b[a-zA-Z]*([a-zA-Z])\1\b + ``` +- 正整数中剔除`0、1、2、8、9、10`。 + ```ruby + ^(\d{3,})|(1[1-9])|([2-9]\d)|([34567]{1})$ + ``` + 正则表达式解释: + `(\d{3,})` 匹配:3位及以上数字 + `(1[1-9])` 匹配:以1开头的2位数 + `([2-9]\d)` 匹配:非1开头的2位数 + `([34567]{1})` 匹配:除0、1、2、8、9之外的1位数 + +# 参考 + +1. [Java 正则表达式](https://www.runoob.com/java/java-regular-expressions.html "Java 正则表达式") +2. [正则表达式 - 语法](https://www.runoob.com/regexp/regexp-syntax.html "正则表达式 - 语法") +3. [Regex 正则表达式中几个符号的概念](https://www.jianshu.com/p/9c4979a3b7e4 "Regex 正则表达式中几个符号的概念") +4. [正则表达式——“?”的几种用法](https://blog.csdn.net/qq_37683835/article/details/88601721 "正则表达式——“?”的几种用法") \ No newline at end of file