Skip to content

正则表达式

Java当中,String s = ..... s.match(String regex)输入一个正则表达式,如果匹配则返回true 正则表达式是一种"规则".

48ac23bbe9877366f4bbcea84e5494cc_MD5 注意 第一个表: 只能匹配一个字符 第四条只是第三条的另一种表达. 第五条注意不能写成& 一个&表示匹配一个'&'而已 如果括号里只有一个字符,那么可以省略括号 第二个表: 只能匹配一个字符 第二列表示等价的表达形式 \ 注意这是Java的转译字符,因此在使用第二个表的时候需要处理一下.

小括号:表示一组,可见邮箱的样例.


样例: 9f2c2443fa968e1eb8f2a51fbfbb3939_MD5 也就是汉字也是一个字符. 另外:非常重要的:如果我想匹配字符.怎么办?这时不能用.(因为这是匹配任意字符的意思),而应该用\\.(原理:应该写成\.表示匹配的是. 然后java本身又需要转译\,故写成\\.)

想要出现多次怎么办? 前两个表的基础上,加上数量词即可: 8430c887b13f8e596c950d5d56ebf826_MD5 例子: 7a4a71e372367f70cd03efe0e489f282_MD5 c493b9af785ada34bfdfc9fc838dc9e3_MD5

常见的邮箱: 0d629ec4c876fc05fe86b66acb50bf3d_MD5 当然,这里限制3.1 3.3的长度是不对的.因此,最好写成:

\\w+@[\\w&&[^_]]+(\\.[\\w&&[^_]]+){1,2}

插件推荐: any-rule d5ac437405f1b4ea694f342589050c55_MD5 2e92a53a97276ae8afd7d3281a29c286_MD5 注意最后生成的会在开头有^(表示开头开始匹配),结尾有$(表示匹配到结尾) java默认就是从头比到尾. 另外,生成的表达式里只有一个\,java中还需要给每个\转译一下


其他符号: - | 表示或者 如匹配小时:([01]\d|2[0-3]) 1a93c0ab5961c51ad05f3b847d3d0dea_MD5 上面这是两种写法

这个"或者"是经常需要配合括号使用的. 0a749a07aaaa8e4dd5549e9b8adbf384_MD5 这是对的 如果没有括起来,那么左边所有的都算是|的一部分了

当然,会发现|实际上和[]的作用很像的. fc15360fcc2e9448ea6e1be7ceac1bd0_MD5 - 忽略大小写 d1ab03856420f94dd1aa81ef25d2c2ed_MD5 如何只忽略bc的大小写? a(?i)bc 只忽略b的怎么办? a((?i)b)c - 括号:实际上就是匹配一个字符串.也就是把括起来的部分视作一个字符串的整体.


c73c31f4101986dd12e8e7bf4abe0d66_MD5

正反斜线傻傻分不清? / 是上坡,那么就是正斜线 \是下坡,那么就是反斜线


正则表达式除了匹配校验的作用,还有查找字符串的作用.

Pattern类:属于java.util.regex Matcher类:同样属于java.util.regex

f36d3253ff3568a06e212a1d0d729ef2_MD5 如上,那么会发现Java 的初始索引为0,结束索引+1 为 4 注意compile是静态方法. 1ebb0281f01686d5cb6b686269b4392e_MD5 继续调用,会往后读取后面的内容. 改进: 79788c14b70e59adda0ff363ef02b910_MD5


带条件的爬取 52facf91d9ef1f877f4bf56687080573_MD5 结果: 06dfd01d761d46dbac31f15032284ba9_MD5 当然,这样效果不是很明显,我们改一下原本的文本:(改了大小写) 776aa887a66f6eeec71bd6db4666c931_MD5 需求1: 53eff25ba9c3575f0bbd8cbb4762303a_MD5 需求二是什么? 318e2d10f01c8d5f0181c09d338624f0_MD5 实际上regex2和3是一样的的. regex3当中,?表示站位符,也就是代表前面的java.?:表示返回所有的文本 需求三: ! 表示去除. 47960b45b29a6930a6c0971b7bb8e3d7_MD5

总结: ?= 返回?的占位部分. ?: 返回所有. ?! 匹配的时候?部分的后面不能包括什么 如果看不懂可以往下看,看到非捕获分组再回来.


贪婪爬取和非贪婪爬取.(带条件爬取的一种) ab+可以匹配多个文本: ab,abb,abbb... 0e112c3db2e5561e00fe1dca75df9cba_MD5

java默认是贪婪爬取. 如果我们在数量词+/* 后加上? 就是非贪婪爬取. b2978f09eb9ef3933f953b6cc1ce38e1_MD5 打印ab.


replaceAll 与 split

b94135d18304147df86a3e54b3d170a0_MD5 replaceAll: 09da3314803fb4a7bd61228236738982_MD5 底层: 是String的成员方法 8ffd2423bb6449175d5226d136c807ee_MD5 这里的String的replaceAll是调用了Matcher中的replaceAll方法 Matcher中的replaceAll方法: c07c669c86c9fdb33e00bb2d08132c34_MD5 split: 6c4a8446eeb098e51be1e86d693b86b3_MD5

如何判断某个String方法可以识别正则表达式? 形参命名为regex的一般都是.

因此,我们查看文档,会发现replace方式是不识别正则表达式的.


分组

分组就是一个小括号.

c48678b9bd41c32324a54f5d216e903c_MD5 蓝色框的是第二组,因为是以左括号为基准的.

捕获分组:

处理需求时,需要"一致",就需要用这个. 9e0207f035955f92dc6e66474360a565_MD5 baf850952e3fe29f535da61053997f14_MD5 fb4dd8e265567fb2bd84adb46ff72951_MD5 第三个需求有点麻烦: 先处理"开始部分内部每个字符也需要一致" 8c4d423c105fae7a7f244c9c11b64594_MD5 然后呢? 5f8dffc35c987e30b6fceffaf8f7872b_MD5

正则外部使用

b4bc6f3d77a16cf6a691fa055f549e0e_MD5 c774c3022090c38bc6b8c227ea391b27_MD5

非捕获分组:

bf22f15286479b9e5bd73cacccaecf69_MD5 非捕获分组是不占用组号的. 因此,?:的作用就体现出来了.它是不占用组号的. 316fce1c38819346e2aa557442b1c6b7_MD5 这个玩意是干嘛用的?主要是网上提供的表达式经常用这个.