Java 正则表达式 教程.doc

上传人:啊飒飒 文档编号:11084197 上传时间:2021-06-28 格式:DOC 页数:17 大小:59KB
返回 下载 相关 举报
Java 正则表达式 教程.doc_第1页
第1页 / 共17页
Java 正则表达式 教程.doc_第2页
第2页 / 共17页
Java 正则表达式 教程.doc_第3页
第3页 / 共17页
Java 正则表达式 教程.doc_第4页
第4页 / 共17页
Java 正则表达式 教程.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《Java 正则表达式 教程.doc》由会员分享,可在线阅读,更多相关《Java 正则表达式 教程.doc(17页珍藏版)》请在三一文库上搜索。

1、第一篇:什么是正则表达式?在学习JAVA的正则表达式之前,先介绍一下什么是正则表达式:1、正则表达式是一种强大而灵活的文本处理工具;2、在技术上,正则表达式实现了对字符串的操作,在先前,这些任务一般都指派给了JAVA中的String、StringBuffer和StringTOkenizer这些类;3、正则表达式一般和I/O联合使用;4、正则表达式可以让我们以编程方式指定那些可以再输入字符串中发现的复杂的文本模式,一旦我们发现了这些模式,那么就可以按照任何我们所希望的方式进行处理了;5、正则表达式提供了一种紧凑的、动态的语言,能够以一种完全通用的方式来解决各种字符串处理(例如:匹配、选择、编辑及

2、验证)问题;第二篇:如何创建正则表达式?好了,看到这里我想大家对正则表达式应该已经有了一定的了解了吧,下面我来介绍一下如何创建正则表达式:要 学习正则表达式就必须了解正则表达式的构造集,只有了解了构造集,掌握了模式匹配的原则和方法,你才能写出适合你需要的正则表达式,打个比方,要构造一个 房屋模型,就要使用这一个个的积木,让他们以适当的方式进行拼合,构造集中的匹配符号就好像是搭建房屋模型的一个个小积木,用于创建正则表达式的完全构造 列表可以在javadocs的Pattern类中找到,为了方便查询,我在这里也把这些构造集列了出来,以供参考(注:摘自JDK 5.0 Documentation)资料参

3、考:正则表达式的构造摘要 1)字符 x 字符 x 反斜线字符 0n 带有八进制值 0 的字符 n (0 = n = 7) 0nn 带有八进制值 0 的字符 nn (0 = n = 7) 0mnn 带有八进制值 0 的字符 mnn(0 = m = 3、0 = n = 7) xhh 带有十六进制值 0x 的字符 hh uhhhh 带有十六进制值 0x 的字符 hhhh t 制表符 (u0009) /table n 新行(换行)符 (u000A) r 回车符 (u000D) f 换页符 (u000C) a 报警 (bell) 符 (u0007) e 转义符 (u001B) cx 对应于 x 的控制符

4、 2)字符类 abc a、b 或 c(简单类) abc 任何字符,除了 a、b 或 c(否定) a-zA-Z a 到 z 或 A 到 Z,两头的字母包括在内(范围) a-dm-p a 到 d 或 m 到 p:a-dm-p(并集) a-z&def d、e 或 f(交集) a-z&bc a 到 z,除了 b 和 c:ad-z(减去) a-z&m-p a 到 z,而非 m 到 p:a-lq-z(减去) 3)预定义字符类 . 任何字符(与行结束符可能匹配也可能不匹配) d 数字:0-9 D 非数字: 0-9 s 空白字符: tnx0Bfr S 非空白字符:s w 单词字符:a-zA-Z_0-9 W 非

5、单词字符:w 4)POSIX 字符类(仅 US-ASCII) pLower 小写字母字符:a-z pUpper 大写字母字符:A-Z pASCII 所有 ASCII:x00-x7F pAlpha 字母字符:pLowerpUpper pDigit 十进制数字:0-9 pAlnum 字母数字字符:pAlphapDigit pPunct 标点符号:!#$%&()*+,-./:;?_| pGraph 可见字符:pAlnumpPunct pPrint 可打印字符:pGraphx20 pBlank 空格或制表符: t pCntrl 控制字符:x00-x1Fx7F pXDigit 十六进制数字:0-9a-f

6、A-F pSpace 空白字符: tnx0Bfr 5)java.lang.Character 类(简单的 java 字符类型) pjavaLowerCase 等效于 java.lang.Character.isLowerCase() pjavaUpperCase 等效于 java.lang.Character.isUpperCase() pjavaWhitespace 等效于 java.lang.Character.isWhitespace() pjavaMirrored 等效于 java.lang.Character.isMirrored() 6)Unicode 块和类别的类 pInGree

7、k Greek 块(简单块)中的字符 pLu 大写字母(简单类别) pSc 货币符号 PInGreek 所有字符,Greek 块中的除外(否定) pL&pLu 所有字母,大写字母除外(减去) 7)边界匹配器 行的开头 $ 行的结尾 b 单词边界 B 非单词边界 A 输入的开头 G 上一个匹配的结尾 Z 输入的结尾,仅用于最后的结束符(如果有的话) z 输入的结尾 8)Greedy 数量词 X? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 Xn X,恰好 n 次 Xn, X,至少 n 次 Xn,m X,至少 n 次,但是不超过 m 次 9)Reluctant 数量词 (后边

8、多加了“?”)X? X,一次或一次也没有 X*? X,零次或多次 X+? X,一次或多次 Xn? X,恰好 n 次 Xn,? X,至少 n 次 Xn,m? X,至少 n 次,但是不超过 m 次 10)Possessive 数量词 (后边多加了“+”)X?+ X,一次或一次也没有 X*+ X,零次或多次 X+ X,一次或多次 Xn+ X,恰好 n 次 Xn,+ X,至少 n 次 Xn,m+ X,至少 n 次,但是不超过 m 次 11)Logical 运算符 XY X 后跟 Y X|Y X 或 Y (X) X,作为捕获组 12)Back 引用 n 任何匹配的 nth 捕获组 13)引用 Nothi

9、ng,但是引用以下字符 Q Nothing,但是引用所有字符,直到 E E Nothing,但是结束从 Q 开始的引用 14)特殊构造(非捕获) (?:X) X,作为非捕获组 (?idmsux-idmsux) Nothing,但是将匹配标志由 on 转为 off (?idmsux-idmsux:X) X,作为带有给定标志 on - off 的非捕获组 (?=X) X,通过零宽度的正 lookahead (?!X) X,通过零宽度的负 lookahead (?=X) X,通过零宽度的正 lookbehind (?X) X,作为独立的非捕获组 作为一个例子,下面的每一个表达式都是合法的正则表达式,

10、并且所有表达式都会成功匹配字符序列Rudolph。第一个:Rudolph 注:就是单词本身,绝对匹配;第二个:rRudolph 注:第一个字母可以在 r 和 R 中选择一个匹配,所以也能成功;第三个:rRaeioua-zol.* 注:第一个字母在 r 和 R 中匹配,第二个字母在原音字母aeiou中匹配,第三个字母在a到z的26个字母中匹配,第四个字母和第五个字母被绝对匹配,后面的字符可以是任意的,因此这样的匹配也能成功;第四个:R.* 注:第一个字母被绝对匹配,后面的字符可以是任意的匹配原则,所以也成功了。在这个例子中遇到了一个.*的匹配符号,在这里我只解释:. 代表任何字符、* 代表任何字

11、符即.可以出现零次或多次,这是一个非常常用的匹配符号,大家最好能够记住。类似的,要想写出符合自己需求的正则表达式,可以参照构造类表对各类字符,以及匹配原则和方法的规定实现。第三篇:正则表达式中的一个重要概念:量词为 什么说量词是正则表达式中的一个重要的概念呢,如何有Java编程思想一书的同学可以看到,量词被放到了单独的一个章节进行了讲述,由此可见其一同一 般,主要是因为量词构造集在正则表示式的编写的时候是使用率非常平凡的构造集,也可以理解为是正则表达式的一个灵魂,所以要重视它的重要性。量词,字面上的理解就是数量词,在正则表达式它又是被如何重新理解的呢?在Java编程思想一书中的定义是:“量词描

12、述了一个模式吸收输入文本的方式”,这里的方式被分为三种:贪婪的、勉强的、占有的。通俗的解释可以是这样的:对一个字符或字符串在对出现次数上进行的限制和匹配。在上面的构造集中也写出了这三种方式的匹配标准,这里就不做介绍了,对于这三种方式有什么区别,我给出Java编程思想一书做出的解释,大家可以根据自己的业务需要进行选择。1)贪婪的。量词总是贪婪的,除非有其他的选项被设置。贪婪表达式会为所有可能的模式发现尽可能多的匹配。导致此问题的一个典型理由就是假定我们的模式仅能匹配第一个可能的字符组,如果它是贪婪的,那么它就会继续往下匹配。2)勉强的。有问号来指定,这个量词匹配满足模式所需的最少字符数。因此也称

13、作懒惰的,最少匹配的,非贪婪的、或不贪婪的。3) 占有的。量词当前只有在JAVA语言中才可用(在其他语言中不可用),并且它也是更高级,因此我们大概不会立刻用到它。当正则表达式被应用于字符串时,它 会产生相当多的状态,以便在匹配失败时可以回溯。而占有的量词并不保存这些中间状态,因此我们可以防止回溯。它们常常由于防止正则表达式失控,因此可以使 正则表达式执行起来更有效。注意点:在使用量词的时候,最好将要使用量词的字符或字符串有括号括起来;第四篇:模式与匹配器在介绍了一些正则表达式的基础之后,下面说说正则表达式在Java中是如何体现的,说的更明白一些也就是在Java中如何实现、如何编写代码。在Jav

14、a 中,正则表达式是通过java.util.regex包中的Pattern和Matcher两个类来实现的。一个Pattern对象表示一个正则表达式的 编译版本,可以做类似的对比,就好像是java文件和class文件,一个是让程序员看的,一个是让虚拟机执行的,在Java中一个正则表达式要转换为 Pattern对象才能最终被使用,Pattern的complie()方法可以实现,同时,我们可以使用matcher()方法和输入字符串从编译过的 Pattern对象中产生Matcher对象,在Matcher中可以得到你想要得到的处理完成以后的结果值的信息。下来介绍Matcher类中的几个重要方法:1)fi

15、nd():用户发现应用于CharSequence(即输入的字符串)的多重模式匹配,find()就像是一种迭代器,可以在输入字符串中向前移动迭代,在find()的第二版中,可以指定一个整型参数以告知要开始搜索的字符的位置;2)groupCount():在介绍这个方法的之前,现介绍一个概念:“组” 组是由圆括号分开的多个正则表达式,随后可以根据它们的组号进行调用。第0组表示整个匹配表达式,第1组表示第一个用圆括号括起来的组,等等,因此,在表达式A(B(C)D中有三个组:第0组ABCD,第1组BC,第2组C。 groupCount()方法返回该模式中分组的数目。要注意的是第0组不包括在内。3)gro

16、up():返回由以前匹配操作所匹配的输入子序列。4)group(int i):返回在以前匹配操作期间由给定组捕获的输入子序列。如果匹配成功,但是指定的组没有匹配输入字符串的任何部分,将返回null。5)start(int group):返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引。6)end(int group):返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。7)start(): 返回以前匹配的初始索引。8)end(): 返回最后匹配字符之后的偏移量。模式标记:模式标记是可以影响正则表达式的匹配行为的标记参数,为方便理解,列出这些标记的作用:Pattern

17、.CANON_EQ :启用规范等价。 Pattern.CASE_INSENSITIVE :启用不区分大小写的匹配。 Pattern.COMMENTS :模式中允许空白和注释。 Pattern.DOTALL :启用 dotall 模式,在dotall模式中,表达式.匹配多有字符,包括行终结符,缺省情况下,.表达式不匹配行终结符。 Pattern.LITERAL :启用模式的字面值分析。 Pattern.MULTILINE :启用多行模式。 Pattern.UNICODE_CASE :启用 Unicode 感知的大小写折叠。 Pattern.UNIX_LINES :启用 Unix 行模式。替换操作

18、:替换操作在正则表达式中起了尤为重要的作用,能够实现替换操作的几个方法是:1)replaceFirst(String replacement) :用replacement替换输入字符串中最先匹配的部分。2)replaceAll(String replacement) :用replacement替换输入字符串中所有匹配的部分。3) appendReplacement(StringBuffer sb, String replacement) :逐步的在sb中执行替换;而不是像replaceFirst()那样仅替换第一个匹配,或者像replaceAll()那样替换所有的匹配。这是个非常 重要的方法,

19、因为它允许我们通过调用某些方法来执行一些其他处理来产生replacement(而不像replaceFirst()和 replaceAll()只能输入固定字符串)。有了这个方法,我们就可以通过编程来实现将目标拆分成组以及创建功能强大的替换。4)appendTail(StringBuffer sb) :在一个或多个appendReplacement()调用之后被调用,以便复制输入字符串的剩余部分。reset(String s)方法:可以将Matcher对象应用于一个新的字符序列。到 此为止,正则表达式在Java中的一般应用就差不多了,如果想要了解更多关于正则表达式在Java中的使用可以参考Java

20、编程思想、 Mastering Regular Expression(第二版),Jeffrey E.F.Friedl著(OReilly,2002)。正则表达式的应用实例:package Aaron;import java.util.*;import java.util.regex.*;public class Main public Main() public static void main(String arg) Main main=new Main(); main.emailMRE(lzq_); main.replaceMRE(3.23+4.34433-34433.3434,f); /*

21、 * 验证email的正则表达式 * param textStr String */ public void emailMRE(String textStr) String mre = w+w+.w+; Pattern p = Ppile(mre); Matcher m = p.matcher(textStr); if (m.find() System.out.println(验证成功!); else System.out.println(验证失败!); /* * 将指定格式的字符串替换成要求的字符,本例中将表达式中的浮点数提取出来替换, * 浮点数的精度要求为整数位1-8位,小数位1-8位

22、* 同时,将检索出的浮点数的位置在控制台输出 * param textStr String */ public void replaceMRE(String textStr, String requestStr) String mre = d1,8.d1,8; StringBuffer sb = new StringBuffer(); Pattern p = Ppile(mre); Matcher m = p.matcher(textStr); int i = 1; while (m.find() System.out.println(找到第 +i+ 个匹配: + m.group()+ 位置为

23、: + m.start() + - + (m.end()-1); m.appendReplacement(sb, requestStr); i+; m.appendTail(sb); System.out.println(替换后的结果字符串为: + sb); 运行结果:验证成功!找到第1个匹配:3.23 位置为:0-3找到第2个匹配:4.34433 位置为:5-11找到第3个匹配:34433.3434 位置为:13-22替换后的结果字符串为:f+f-f 本文来自CSDN博客,转载请标明出处:http:/ 学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子进行修改,实验。下面给出了一

24、些常用的例子,并对它们作了详细的说明。匹配中文字符的正则表达式: u4e00-u9fa5匹配双字节字符(包括汉字在内):x00-xff应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)String.prototype.len=function()return this.replace(x00-xff/g,aa).length;匹配空行的正则表达式:ns| *r匹配HTML标记的正则表达式:/.*|/ 匹配首尾空格的正则表达式:(s*)|(s*$)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:String.proto

25、type.trim = function()return this.replace(/(s*)|(s*$)/g, );利用正则表达式分解和转换IP地址:下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:function IP2V(ip)re=/(d+).(d+).(d+).(d+)/g /匹配IP地址的正则表达式if(re.test(ip)return RegExp.$1*Math.pow(255,3)+RegExp.$2*Math.pow(255,2)+RegExp.$3*255+RegExp.$4*1elsethrow new Error(Not a

26、valid IP address!)不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:var ip=10.100.20.168ip=ip.split(.)alert(IP值是:+(ip0*255*255*255+ip1*255*255+ip2*255+ip3*1)匹配Email地址的正则表达式:w+(-+.w+)*w+(-.w+)*.w+(-.w+)*匹配网址URL的正则表达式:http:/(w-+.)+w-+(/w- ./?%&=*)?利用正则表达式去除字串中重复的字符的算法程序:注:此程序不正确,原因见本贴回复var s=abacabefgeeiivar

27、s1=s.replace(/(.).*1/g,$1)var re=new RegExp(+s1+,g)var s2=s.replace(re,) alert(s1+s2) /结果为:abcefgi我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1s=http:/ onbeforepaste=clipboardD

28、ata.setData(text,clipboardData.getData(text).replace(/u4E00-u9FA5/g,) 用正则表达式限制只能输入全角字符: onkeyup=value=/blog/value.replace(/uFF00-uFFFF/g,) onbeforepaste=clipboardData.setData(text,clipboardData.getData(text).replace(/uFF00-uFFFF/g,) 用正则表达式限制只能输入数字:onkeyup=value=/blog/value.replace(/d/g,) onbeforepas

29、te=clipboardData.setData(text,clipboardData.getData(text).replace(/d/g,) 用正则表达式限制只能输入数字和英文:onkeyup=value=/blog/value.replace(/W/g,) onbeforepaste=clipboardData.setData(text,clipboardData.getData(text).replace(/d/g,) 本文来自CSDN博客,转载请标明出处:http:/ Oracle 常用函数java连接各类数据库主要代码 java正则表达式JAVA 2009-11-10 16:35

30、阅读225 评论0 字号: 大大 中中 小小 Java正则表达式的解释说明 表达式意义:1.字符x 字符 x。例如a表示字符a 反斜线字符。在书写时要写为d)任何字符(与行结束符可能匹配也可能不匹配)d 数字:0-9D 非数字: 0-9s 空白字符: tnx0BfrS 非空白字符:sw 单词字符:a-zA-Z_0-9W 非单词字符:w4.POSIX 字符类(仅 US-ASCII)(注意反斜杠要写两次,例如pLower写为pLower)pLower 小写字母字符:a-z。pUpper 大写字母字符:A-ZpASCII 所有 ASCII:x00-x7FpAlpha 字母字符:pLowerpUppe

31、rpDigit 十进制数字:0-9pAlnum 字母数字字符:pAlphapDigitpPunct 标点符号:!#$%&()*+,-./:;?_|pGraph 可见字符:pAlnumpPunctpPrint 可打印字符:pGraphx20pBlank 空格或制表符: tpCntrl 控制字符:x00-x1Fx7FpXDigit 十六进制数字:0-9a-fA-FpSpace 空白字符: tnx0Bfr5.java.lang.Character 类(简单的 java 字符类型)pjavaLowerCase 等效于 java.lang.Character.isLowerCase()pjavaUppe

32、rCase 等效于 java.lang.Character.isUpperCase()pjavaWhitespace 等效于 java.lang.Character.isWhitespace()pjavaMirrored 等效于 java.lang.Character.isMirrored()6.Unicode 块和类别的类pInGreek Greek 块(简单块)中的字符pLu 大写字母(简单类别)pSc 货币符号PInGreek 所有字符,Greek 块中的除外(否定)pL&pLu 所有字母,大写字母除外(减去)7.边界匹配器 行的开头,请在正则表达式的开始处使用。例如:(abc)表示以a

33、bc开头的字符串。注意编译的时候要设置参数MULTILINE,如 Pattern p = Ppile(regex,Pattern.MULTILINE);$ 行的结尾,请在正则表达式的结束处使用。例如:(bca).*(abc$)表示以bca开头以abc结尾的行。b 单词边界。例如b(abc)表示单词的开始或结束包含有abc,(abcjj、jjabc 都可以匹配)B 非单词边界。例如B(abc)表示单词的中间包含有abc,(jjabcjj匹配而jjabc、abcjj不匹配)A 输入的开头G 上一个匹配的结尾(个人感觉这个参数没什么用)。例如Gdog表示在上一个匹配结尾处查找dog如果没有的话则从开

34、头查找,注意如果开头不是dog则不能匹配。Z 输入的结尾,仅用于最后的结束符(如果有的话)行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符: 新行(换行)符 (n)、 后面紧跟新行符的回车符 (rn)、 单独的回车符 (r)、 下一行字符 (u0085)、 行分隔符 (u2028) 或 段落分隔符 (u2029)。z 输入的结尾当编译模式时,可以设置一个或多个标志,例如Pattern pattern = Ppile(patternString,Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE);下面六个标志都是支

35、持的:CASE_INSENSITIVE:匹配字符时与大小写无关,该标志默认只考虑US ASCII字符。UNICODE_CASE:当与CASE_INSENSITIVE结合时,使用Unicode字母匹配MULTILINE:和$匹配一行的开始和结尾,而不是整个输入UNIX_LINES: 当在多行模式下匹配和$时,只将n看作行终止符DOTALL: 当使用此标志时,.符号匹配包括行终止符在内的所有字符CANON_EQ: 考虑Unicode字符的规范等价8.Greedy 数量词X? X,一次或一次也没有X* X,零次或多次X+ X,一次或多次Xn X,恰好 n 次Xn, X,至少 n 次Xn,m X,至少

36、 n 次,但是不超过 m 次9.Reluctant 数量词X? X,一次或一次也没有X*? X,零次或多次X+? X,一次或多次Xn? X,恰好 n 次Xn,? X,至少 n 次Xn,m? X,至少 n 次,但是不超过 m 次10.Possessive 数量词X?+ X,一次或一次也没有X*+ X,零次或多次X+ X,一次或多次Xn+ X,恰好 n 次Xn,+ X,至少 n 次Xn,m+ X,至少 n 次,但是不超过 m 次Greedy,Reluctant,Possessive的区别在于:(注意仅限于进行.等模糊处理时)greedy量 词被看作“贪婪的”,因为它第一次就读入整个被模糊匹配的字符

37、串。如果第一个匹配尝试(整个输入字符串)失败,匹配器就会在被匹配字符串中的最后一位后退一个字符并且再次尝试,重复这个过程,直到找到匹配或者没有更多剩下的字符可以后退为止。根据表达式中使用的量词,它最后试图匹配的内容是1 个或者0个字符。但是,reluctant量词采取相反的方式:它们从被匹配字符串的开头开始,然后逐步地一次读取一个字符搜索匹配。它们最后试图匹配的内容是整个输入字符串。最后,possessive量词总是读完整个输入字符串,尝试一次(而且只有一次)匹配。和greedy量词不同,possessive从不后退。11.Logical 运算符XY X 后跟 YX|Y X 或 Y(X) X,

38、作为捕获组。例如(abc)表示把abc作为一个整体进行捕获12.Back 引用n 任何匹配的 nth捕获组捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 (A)(B(C)中,存在四个这样的组: 1 (A)(B(C)2 A3 (B(C)4 (C)在表达式中可以通过n来对相应的组进行引用,例如(ab)341就表示ab34ab,(ab)34(cd)12就表示ab34cdabcd。13.引用 Nothing,但是引用以下字符Q Nothing,但是引用所有字符,直到 E。QE之间的字符串会原封不动的使用(1.1中转义字符的除外)。例如, abQ|E可以匹配ab|E Nothing,但是结束从

39、 Q开始的引用14.特殊构造(非捕获)(?:X) X,作为非捕获组(?idmsux-idmsux) Nothing,但是将匹配标志由 on 转为 off。比如:表达式 (?i)abc(?-i)def 这时,(?i) 打开不区分大小写开关,abc 匹配idmsux说明如下:i CASE_INSENSITIVE :US-ASCII 字符集不区分大小写。(?i)d UNIX_LINES : 打开UNIX换行符m MULTILINE :多行模式(?m)UNIX下换行为nWINDOWS下换行为rn(?s)u UNICODE_CASE : Unicode 不区分大小写。(?u)x COMMENTS :可以在pattern里面使用注解,忽略pattern里面的whitespace,以及#一直到结尾(#后面为注解)。(?x)例如(?x)abc#asfsd

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1