执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,’Windows (?=95|98|NT|2000)‘ 匹配“Windows 2000”中的“Windows”,但不匹配“Windows 3.1”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
(?!pattern)
执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,’Windows (?!95|98|NT|2000)‘ 匹配“Windows 3.1”中的 “Windows”,但不匹配“Windows 2000”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
x|y
匹配 x 或 y。例如,’z|food‘ 匹配“z”或“food”。’(z|f)ood‘ 匹配“zood”或“food”。
[xyz]
字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”。
package regexp; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestRegexp { public static void main(String[] args) { //简单认识正则表达试的概念; // p(“abc”.matches(“…”)); // p(“a8588a”.replaceAll(“//d”, “-”)); // //三句话效率高; // Pattern p=Pattern.compile(“[a-z]{3}”); // Matcher m= p.matcher(“fgh”); // p(m.matches()); // p(“fgha”.matches(“[a-z]{3}”)); //初步认识 ;* + ? // p(“aa”.matches(“.a”)); // p(“A”.matches(“[ABC]”)); // p(“//”.matches(“”)); // // p(“hello sir”.matches(“^h.*”)); // p(“hello sir”.matches(“.*ir$”)); // p(“hello sir”.matches(“^h[a-z]{1,2}o.*”)); // p(“aaa8888c”.matches(“.*//d{4}.”)); // //匹配emil正则表达式 // p(“381186704@163.com”.matches(“[//w[.-]]+@[//w[.-]]+//.[//w]+”)); // /*Pattern p=Pattern.compile(“java”,Pattern.CASE_INSENSITIVE); Matcher m=p.matcher(“java Java JAVa JaVa IloveJAVA hae Java123456”);; StringBuffer buf=new StringBuffer(); int i=0; while(m.find()){ if(i%2==0) m.appendReplacement(buf, “java”); else m.appendReplacement(buf, “JAVA”); i++; } m.appendTail(buf); p(buf);*/ // p(m.replaceAll(“java”)); p(“----------------------Possessive Reluctant “); Pattern p2=Pattern.compile(”(.{3,10}?)[0-9]”); String s2=“aaaa5bbbb6”; Matcher m2=p2.matcher(s2); if(m2.find()) p(m2.start()+“-”+m2.end()); else p(“not match”); p(“----------------------back refenrences”); Pattern p3=Pattern.compile(“(//d(//d))//2”); String s3=“122”; Matcher m3= p3.matcher(s3); p(m3.matches()); } public static void p(Object o){ System.out.println(o); } }
非捕获组
| 构造 | 匹配 |
| :-- | :-- |
| |
| 字符 |
| x | 字符 x |
| // | 反斜线字符 |
| /0_n_ | 带有八进制值 0 的字符 n (0 <= n <= 7) |
| /0_nn_ | 带有八进制值 0 的字符 nn (0 <= n <= 7) |
| /0_mnn_ | 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7) |
| /x_hh_ | 带有十六进制值 0x 的字符 hh |
| /u_hhhh_ | 带有十六进制值 0x 的字符 hhhh |
| /t | 制表符 (‘/u0009’) |
| /n | 新行(换行)符 (‘/u000A’) |
| /r | 回车符 (‘/u000D’) |
| /f | 换页符 (‘/u000C’) |
| /a | 报警 (bell) 符 (‘/u0007’) |
| /e | 转义符 (‘/u001B’) |
| /c_x_ | 对应于 x 的控制符 |
| |
| 字符类 |
| [abc] | a、b 或 c(简单类) |
| [^abc] | 任何字符,除了 a、b 或 c(否定) |
| [a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
| [a-d[m-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](减去) |
| |
| 预定义字符类 |
| . | 任何字符(与行结束符可能匹配也可能不匹配) |
| /d | 数字:[0-9] |
| /D | 非数字: [^0-9] |
| /s | 空白字符:[ /t/n/x0B/f/r] |
| /S | 非空白字符:[^/s] |
| /w | 单词字符:[a-zA-Z_0-9] |
| /W | 非单词字符:[^/w] |
| |
| POSIX 字符类(仅 US-ASCII) |
| /p{Lower} | 小写字母字符:[a-z] |
| /p{Upper} | 大写字母字符:[A-Z] |
| /p{ASCII} | 所有 ASCII:[/x00-/x7F] |
| /p{Alpha} | 字母字符:[/p{Lower}/p{Upper}] |
| /p{Digit} | 十进制数字:[0-9] |
| /p{Alnum} | 字母数字字符:[/p{Alpha}/p{Digit}] |
| /p{Punct} | 标点符号:!"#$%&'()*+,-./:;<=>?@[/]^_`{|}~ |
| /p{Graph} | 可见字符:[/p{Alnum}/p{Punct}] |
| /p{Print} | 可打印字符:[/p{Graph}/x20] |
| /p{Blank} | 空格或制表符:[ /t] |
| /p{Cntrl} | 控制字符:[/x00-/x1F/x7F] |
| /p{XDigit} | 十六进制数字:[0-9a-fA-F] |
| /p{Space} | 空白字符:[ /t/n/x0B/f/r] |
| |
| java.lang.Character 类(简单的 java 字符类型) |
| /p{javaLowerCase} | 等效于 java.lang.Character.isLowerCase() |
| /p{javaUpperCase} | 等效于 java.lang.Character.isUpperCase() |
| /p{javaWhitespace} | 等效于 java.lang.Character.isWhitespace() |
| /p{javaMirrored} | 等效于 java.lang.Character.isMirrored() |
| |
| Unicode 块和类别的类 |
| /p{InGreek} | Greek 块(简单块)中的字符 |
| /p{Lu} | 大写字母(简单类别) |
| /p{Sc} | 货币符号 |
| /P{InGreek} | 所有字符,Greek 块中的除外(否定) |
| [/p{L}&&[^/p{Lu}]] | 所有字母,大写字母除外(减去) |
| |
| 边界匹配器 |
| ^ | 行的开头 |
| $ | 行的结尾 |
| /b |
单词边界,匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“/b”是零宽度的。
|
| /B | 非单词边界 |
| /A | 输入的开头 |
| /G | 上一个匹配的结尾 |
| /Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
| /z | 输入的结尾 |
| |
| Greedy 数量词 |
| X? | X,一次或一次也没有 |
| X* | X,零次或多次 |
| X+ | X,一次或多次 |
| X{n} | X,恰好 n 次 |
| X{n,} | X,至少 n 次 |
| X{n,m} | X,至少 n 次,但是不超过 m 次 |
| |
| Reluctant 数量词 |
| X?? | X,一次或一次也没有 |
| X*? | X,零次或多次 |
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
学习分享
在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了
很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘
如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。
2021最新上万页的大厂面试真题
七大模块学习资料:如NDK模块开发、Android框架体系架构…
只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
这份体系学习笔记,适应人群: **第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。 **第二,**开发几年,不知道如何进阶更进一步,比较迷茫。 第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢! 由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示
544-1711877115356)]
只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
这份体系学习笔记,适应人群: **第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。 **第二,**开发几年,不知道如何进阶更进一步,比较迷茫。 第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢! 由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示
本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录
参考文章
发表评论