正则表达式的写法探索

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 */  。。。。 

正则 //*.*? */

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值