摘要:匹配前面的子表达式零次或多次。例如就是一个比更简略的表达式。正则表达式中可以使用编码。如果之前至少有个获得子表达式,则为向后引用。
前端常用的正则表达式 通过一些例子来学习正则表达式摘录,js正则函数match、exec、test、search、replace、split
//去除首尾的‘/’ input = input.replace(/^/*|/*$/g,""); javascript:; 、javascript:void(0) "javascript:;".match(/^(javascripts*:|#)/); //["javascript:", "javascript:", index: 0, input: "javascript:;"]匹配
var str = "access_token=dcb90862-29fb-4b03-93ff-5f0a8f546250; refresh_token=702f4815-a0ff-456c-82ce-24e4d7d619e6; account_uid=1361177947320160506170322436"; str.match(/account_uid=([^=]+(;)|(.*))/ig);匹配一些字符
var str = "asdf html-webpack-plugin for "index/index.html" asdfasdf"; str.match(/html-webpack-plugin for "(.*)"/ig); console.log(RegExp.$1) //=>index/index.html关键字符替换
"css/[hash:8].index-index.css".replace(/[(?:(w+):)?(contenthash|hash)(?::([a-z]+d*))?(?::(d+))?]/ig,"(.*)"); //=> css/(.*).index-index.css替换参数中的值
var str = ""; str.replace(/]*manifest="([^"]*)"[^>]*>/,function(word){ return word.replace(/manifest="([^"]*)"/,"manifest=""+url+"""); }).replace(/]*>)/,function(word){ if(word.indexOf("manifest")) return word; return word.replace(" 匹配括号内容"max_length(12)".match(/^(.+?)((.+))$/) // ["max_length(12)", "max_length", "12", index: 0, input: "max_length(12)"]调换var name = "Doe, John"; name.replace(/(w+)s*, s*(w+)/, "$2 $1"); //=> "John Doe"字符串截取var str = "asfdf === sdfaf ##" str.match(/[^===]+(?=[===])/g) // 截取 ===之前的内容 str.replace(/ /g,"") // 替换字符串中的 换行字符验证 小数点后几位验// 精确到1位小数 /^[1-9][0-9]*$|^[1-9][0-9]*.[0-9]$|^0.[0-9]$/.test(1.2); // 精确到2位小数 /^[0-9]+(.[0-9]{2})?$/.test(1.221);密码强度正则// 必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。 /^(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/.test("weeeeeeeW2"); //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符 /^.*(?=.{6,})(?=.*d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/.test("diaoD123#"); //输出 true校验中文/^[u4e00-u9fa5]{0,}$/.test("但是d"); //false /^[u4e00-u9fa5]{0,}$/.test("但是"); //true /^[u4e00-u9fa5]{0,}$/.test("但是"); //true包含中文正则/[u4E00-u9FA5]/.test("但是d") //true 由数字、26个英文字母或下划线组成的字符串 /^w+$/.test("ds2_@#"); // false身份证号正则//身份证号(18位)正则 /^[1-9]d{5}(18|19|([23]d))d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$/.test("42112319870115371X"); //输出 false校验日期 “yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。//日期正则,简单判定,未做月份及日期的判定 var dP1 = /^d{4}(-)d{1,2}1d{1,2}$/; //输出 true console.log(dP1.test("2017-05-11")); //输出 true console.log(dP1.test("2017-15-11")); //日期正则,复杂判定 var dP2 = /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/; //输出 true console.log(dP2.test("2017-02-11")); //输出 false console.log(dP2.test("2017-15-11")); //输出 false console.log(dP2.test("2017-02-29")); // true校验文件后缀var strRegex = "(.jpg|.gif|.txt)"; var re=new RegExp(strRegex); if (re.test(str)){ } /(.jpg|.gif)+(?|#|$)/.test("a/b/c.jpgsss"); //=> false /(.jpg|.gif)+(?|#|$)/.test("a/b/c.jpg?"); //=> true用户名正则//用户名正则,4到16位(字母,数字,下划线,减号) /^[a-zA-Z0-9_-]{4,16}$/.test("diaodiao"); //输出 true整数正则/^d+$/.test("42"); //正整数正则 -> 输出 true /^-d+$/.test("-42"); //负整数正则 -> 输出 true /^-?d+$/.test("-42"); //整数正则 -> 输出 true /^[0-9]+$/.test(25.5455) //正整数正则 -> 输出 false // 浮点数 /^(?:[-+])?(?:[0-9]+)?(?:.[0-9]*)?(?:[eE][+-]?(?:[0-9]+))?$/.test(0.2)数字正则 可以是整数也可以是浮点数/^d*.?d+$/.test("42.2"); //正数正则 -> 输出 true /^-d*.?d+$/.test("-42.2"); //负数正则 -> 输出 true /^-?d*.?d+$/.test("-42.2"); //数字正则 -> 输出 trueEmail正则//Email正则 /^([A-Za-z0-9_-.])+@([A-Za-z0-9_-.])+.([A-Za-z]{2,4})$/.test("wowohoo@qq.com"); //输出 true // 1.邮箱以a-z、A-Z、0-9开头,最小长度为1. // 2.如果左侧部分包含-、_、.则这些特殊符号的前面必须包一位数字或字母。 // 3.@符号是必填项 // 4.右则部分可分为两部分,第一部分为邮件提供商域名地址,第二部分为域名后缀,现已知的最短为2位。 // 最长的为6为。 // 5.邮件提供商域可以包含特殊字符-、_、. /^[a-z0-9]+([._-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test("wowohoo@qq.com");传真号码// 国家代码(2到3位)-区号(2到3位)-电话号码(7到8位)-分机号(3位) /^(([0+]d{2,3}-)?(0d{2,3})-)(d{7,8})(-(d{3,}))?$/.test("021-5055455")手机号码正则//手机号正则 /^1[34578]d{9}$/.test("13611778887"); //输出 true //* 13段:130、131、132、133、134、135、136、137、138、139 //* 14段:145、147 //* 15段:150、151、152、153、155、156、157、158、159 //* 17段:170、176、177、178 //* 18段:180、181、182、183、184、185、186、187、188、189 //* 国际码 如:中国(+86) /^((+?[0-9]{1,4})|((+86)))?(13[0-9]|14[57]|15[012356789]|17[03678]|18[0-9])d{8}$/.test("13611778887");URL正则//URL正则 /^((https?|ftp|file)://)?([da-z.-]+).([a-z.]{2,6})([/w .-]*)*/?$/.test("http://wangchujiang.com"); //输出 true //获取url中域名、协议正则 "http://xxx.xx/xxx","https://xxx.xx/xxx","//xxx.xx/xxx" /^(http(?:|s):)*//([^/]+)/.test("http://www.baidu.com"); /^((http|https)://(w+:{0,1}w*@)?(S+)|)(:[0-9]+)?(/|/([w#!:.?+=&%@!-/]))?$/.test("https://www.baidu.com/s?wd=@#%$^&%$#") // 必须有协议 /^[a-zA-Z]+:///.test("http://www.baidu.com");IPv4地址正则//ipv4地址正则 /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test("192.168.130.199"); //输出 true十六进制颜色正则//RGB Hex颜色正则 /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/.test("#b8b8b8"); //输出 trueQQ号码正则//QQ号正则,5至11位 /^[1-9][0-9]{4,10}$/.test("398188661");//输出 true微信号正则//微信号正则,6至20位,以字母开头,字母,数字,减号,下划线 /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/.test("jslite"); //输出 true车牌号正则//车牌号正则 /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/.test("沪B99116") //输出 true颜色值校验// HEX 颜色正则 /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test("#ccb2b2")正则表单 1 用户名正则//用户名正则,4到16位(字母,数字,下划线,减号) var uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //输出 true console.log(uPattern.test("caibaojian"));2 密码强度正则//密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符 var pPattern = /^.*(?=.{6,})(?=.*d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/; //输出 true console.log("=="+pPattern.test("caibaojian#"));3 整数正则//正整数正则 var posPattern = /^d+$/; //负整数正则 var negPattern = /^-d+$/; //整数正则 var intPattern = /^-?d+$/; //输出 true console.log(posPattern.test("42")); //输出 true console.log(negPattern.test("-42")); //输出 true console.log(intPattern.test("-42"));4 数字正则//正数正则 var posPattern = /^d*.?d+$/; //负数正则 var negPattern = /^-d*.?d+$/; //数字正则 var numPattern = /^-?d*.?d+$/; console.log(posPattern.test("42.2")); console.log(negPattern.test("-42.2")); console.log(numPattern.test("-42.2"));5 Email正则//Email正则 var ePattern = /^([A-Za-z0-9_-.])+@([A-Za-z0-9_-.])+.([A-Za-z]{2,4})$/; //输出 true console.log(ePattern.test("99154507@qq.com"));6 手机号码正则//手机号正则 var mPattern = /^1[34578]d{9}$/; //http://caibaojian.com/regexp-example.html //输出 true console.log(mPattern.test("15507621888"));7 身份证号正则//身份证号(18位)正则 var cP = /^[1-9]d{5}(18|19|([23]d))d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$/; //输出 true console.log(cP.test("11010519880605371X"));8 URL正则//URL正则 var urlP= /^((https?|ftp|file)://)?([da-z.-]+).([a-z.]{2,6})([/w .-]*)*/?$/; //输出 true console.log(urlP.test("http://caibaojian.com"));9 IPv4地址正则//ipv4地址正则 var ipP = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; //输出 true console.log(ipP.test("115.28.47.26"));10 十六进制颜色正则//RGB Hex颜色正则 var cPattern = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/; //输出 true console.log(cPattern.test("#b8b8b8"));11 日期正则//日期正则,简单判定,未做月份及日期的判定 var dP1 = /^d{4}(-)d{1,2}1d{1,2}$/; //输出 true console.log(dP1.test("2017-05-11")); //输出 true console.log(dP1.test("2017-15-11")); //日期正则,复杂判定 var dP2 = /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/; //输出 true console.log(dP2.test("2017-02-11")); //输出 false console.log(dP2.test("2017-15-11")); //输出 false console.log(dP2.test("2017-02-29"));12 QQ号码正则//QQ号正则,5至11位 var qqPattern = /^[1-9][0-9]{4,10}$/; //输出 true console.log(qqPattern.test("65974040"));13 微信号正则//微信号正则,6至20位,以字母开头,字母,数字,减号,下划线 var wxPattern = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/; //输出 true console.log(wxPattern.test("caibaojian_com"));14 车牌号正则//车牌号正则 var cPattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/; //输出 true console.log(cPattern.test("粤B39006"));15 包含中文正则//包含中文正则 var cnPattern = /[u4E00-u9FA5]/; //输出 true console.log(cnPattern.test("蔡宝坚"));方法一:var re=/正则表达式/; re.test($("#id").val())方法二: $("#id").val().match(/正则表达式/);字符 描述正则表达式有多种不同的风格。下表是在PCRE中元字符及其在正则表达式上下文中的行为的一个完整列表:
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。
例如,“n”匹配字符“n”。“ ”匹配一个换行符。序列“”匹配“”而“(”则匹配“(”。 ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“ ”或“ ”之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“ ”或“ ”之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。 {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。 {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。 {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。 . 匹配除“ ”之外的任何单个字符。要匹配包括“ ”在内的任何字符,请使用像“[. ]”的模式。前瞻(pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“(”或“)”。 (?: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”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始字符x|y 匹配x或y。 例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。 [xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。 [^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。 [a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。 [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。 B 匹配非单词边界。“erB”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 cx 匹配由x指明的控制字符。例如,cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。 d 匹配一个数字字符。等价于[0-9]。 D 匹配一个非数字字符。等价于[^0-9]。 f 匹配一个换页符。等价于x0c和cL。 匹配一个换行符。等价于x0a和cJ。 匹配一个回车符。等价于x0d和cM。 s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[f v]。 S 匹配任何非空白字符。等价于[^f v]。 匹配一个制表符。等价于x09和cI。 v 匹配一个垂直制表符。等价于x0b和cK。 w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。 W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。 xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, “x41”匹配“A”。“x041”则等价于“x04&1”。正则表达式中可以使用ASCII编码。. um 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)1”匹配两个连续的相同字符。 标识一个八进制转义值或一个向后引用。如果 之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。 m 标识一个八进制转义值或一个向后引用。如果 m之前至少有nm个获得子表达式,则nm为向后引用。如果 m之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则 m将匹配八进制转义值nm。 ml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。 un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,u00A9匹配版权符号(?)。正则验证验证数字的正则表达式集() 验证数字:^[0-9]*$ 验证n位的数字:^d{n}$ 验证至少n位数字:^d{n,}$ 验证m-n位的数字:^d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 验证非零的正整数:^+?[1-9][0-9]*$ 验证非零的负整数:^-[1-9][0-9]*$ 验证非负整数(正整数 + 0) ^d+$ 验证非正整数(负整数 + 0) ^((-d+)|(0+))$ 验证长度为3的字符:^.{3}$ 验证由26个英文字母组成的字符串:^[A-Za-z]+$ 验证由26个大写英文字母组成的字符串:^[A-Z]+$ 验证由26个小写英文字母组成的字符串:^[a-z]+$ 验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 验证由数字、26个英文字母或者下划线组成的字符串:^w+$ 验证用户密码:^[a-zA-Z]w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数 字和下划线。 验证是否含有 ^%&",;=?$" 等字符:[^%&",;=?$x22]+ 验证汉字:^[u4e00-u9fa5],{0,}$ 验证Email地址:/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/ 验证InternetURL:^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$ ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ 验证电话号码:^((d{3,4})|d{3,4}-)?d{7,8}$:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。 验证身份证号(15位或18位数字):^d{15}|d{18}$ 验证一年的12个月:^(0?[1-9]|1[0-2])$ 正确格式为:“01”-“09”和“1”“12” 验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为:01、09和1、31。 整数:^-?d+$ 非负浮点数(正浮点数 + 0):^d+(.d+)?$ 正浮点数 ^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$ 非正浮点数(负浮点数 + 0) ^((-d+(.d+)?)|(0+(.0+)?))$ 负浮点数 ^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$ 浮点数 ^(-?d+)(.d+)? IP地址:^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/84997.html
摘要:前言在我们做用户授权登录微信授权,以及根据对应浏览器做对应的操作的时候,经常会遇到需要判断用户使用的浏览器的需求,以及在需要用户输入信息的时候,有需要验证的一些正则。 前言 在我们做用户授权登录(微信,qq授权),以及根据对应浏览器做对应的操作的时候,经常会遇到需要判断用户使用的浏览器的需求,以及在需要用户输入信息的时候,有需要验证的一些正则。如果喜欢的话可以点波赞/关注,支持一下,希...
摘要:对前端来说,使用的场景不多,但是像微信端的对话系统的表情包,就使用到了一个特定的规则。我是一个前端,工作年了,现在失业,想进入腾讯工作,这是我的联系方式这个正则虽 我发现有个别字符被这个编辑器给刷掉了,但是灰色区域显示正常,以灰色区域代码为准 什么玩意? 在我刚开始学习编程的时候,就听过正则了,也听说正则很牛逼,懂正则的更牛逼。但是苦于没有人指点,也没有使用正则的场景,自己看教程又懵逼...
阅读 2622·2023-04-26 00:07
阅读 2431·2021-11-15 11:37
阅读 638·2021-10-19 11:44
阅读 2163·2021-09-22 15:56
阅读 1716·2021-09-10 10:50
阅读 1497·2021-08-18 10:21
阅读 2565·2019-08-30 15:53
阅读 1630·2019-08-30 11:11