1. 需求
匹配字符串 "other_ids":"[a,b,c]"
匹配字符串 "other_ids":""
匹配字符串 "other_ids":"[a]"
匹配字符串 "other_ids":"[a,b]"
2. 结果:正确的正则表达式为
String regEx = "\"other_ids\":\""+"(\\[.*\\])?"+"\"";
3.尝试过程
1)先用字符串 "other_ids":"" 作为表达式正确 匹配字符串 "other_ids":"";
2)再去匹配中间的[]字符, "\"other_ids\":\""+"(\\[\\])?"+"\"";作为表达式正确 匹配字符串"other_ids":"[]";
()相当于一组,里面元素是并列出现的,相当于且,(abc)? 表示括号中的abc同时依顺序出现0或1次;
[] 相当于一个元素,里面是单个出现的,相当于或,[abc]* 表示括号中的出现a或b或c出现0或多次;,如果需要单独表示 []字符的话需要加转义字符,字符串中\的转义后为\\,所以此处为\\[
3) 再去匹配[]中间的字符,.* 去匹配0或多个a,b,c;
.表示 除了换行符外的所有字符;
*表示出现0次或多次
4. 需求2
筛选引号中间的部分,如下面src= "",需要往链接的后面手动追加参数,
" <p>\n" + " \t< img src=\"http://202.107.245.52:5400/proxy_gcms/file/content/museum/3/14.png\" alt=\"\" /> \n" + " </p >\n" +
5. 结果2
String regEx = "src=\".*?\"";
6.过程2
A.*?B 是代表 a-b之间 最简单的匹配.*的部分
A.*B 是代表 a-b之间 最多能匹配的.*的部分
?号代表非贪婪限定符,表示最少的部分
不加?正常就是贪婪
注:.*?这个惊喜的发现,太万能了,可以解决所有两个字符中间部分的问题
5. 测试正则表达式的网站
4. 正则表达式规则
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
\ 转义字符
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
匹配两个字符串A与B中间的字符串包含A与B:
表达式: A.*?B(“.“表示任意字符,“?”表示匹配0个或多个)
示例: Abaidu.comB
结果: Awww.apizl.comB
匹配两个字符串A与B中间的字符串包含A但是不包含B:
表达式: A.*?(?=B)
示例: Awww.apizl.comB
结果: Awww.apizl.com
匹配两个字符串A与B中间的字符串且不包含A与B:
表达式: (?<=A).*?(?=B)
这种写法没看懂,我猜测是如果不包含前面匹配的字符写法(?<=要匹配的开始字符),不包含后面要匹配的字符写法(?=要匹配的结束字符)
示例: Awww.baidu.comB
结果: www.baidu.com
\s匹配任意的空白符(包括空格,制表符(Tab),换行符,中文全角空格)
\S则是任意不是空白符的字符
?涉及到贪婪模式
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)
5. 还不熟悉,尝试好久,记录一下
/* 793 */ /* 794 */ 。。。。
正则 //*.*? */