马上加入TC
您需要 登录 才可以下载或查看,没有帐号?立即注册  
 
x
 
 本帖最后由 剑仙十号 于 2018-3-13 11:57 编辑  
 
【字符串类】正则表达式第一课。通配符,数量限制符。 
 
通配符“.”,数量修饰符“?”,数量贪婪符“+” “*”, 数量限制符{ }。 
  
第一节:通配符“.” 
通配符“.”,匹配除换行符以外 的任何单个字符。占据一个字符位置。 
 
var 源字符串 = "A\n1a\n2ab\n2abc\n3abc\n4abc\n4abcd\n5aaaaaa\n6bbbbbb" 
 
上面的每个id号,都用换行符"\n"做分割。 
通配符“.”,匹配除换行符以外的任何东西。用“.”匹配的东西,可以由换行符分隔。匹配4个字符的id,表达式这样写: 
//var arr=正则表达式匹配(…, …, 是否_不区分大小写, 是否全局, 是否Unicode码, 是否多行) 真为是,假为否。 
//var 表达式 = "...." 
 
var 源字符串 = "A\n1a\n2ab\n2abc\n3abc\n4abc\n4abcd\n5aaaaaa\n6bbbbbb" 
var 表达式 = "...." 
var arr=正则表达式匹配(源字符串,表达式,假,真,假,真) 
var n = 数组大小(arr) 
if(n > 0) 
for(var j = 0;  j < n;  j++) 
  traceprint(arr[j]) 
end 
end 
  
======================================================= 
  
第二节:数量修饰符 “?” 
? 用来修饰 前面一个东西的数量。不占字符位置。 
后面跟有 ? 的东西,出现1次或0次。 
  
例子: 
把3个/4个字符的id,都匹配出来。 
var 表达式 = "....?" 
在“.”后面跟有一个“?”号,表示这个“.”可以有,也可以无。 
有“.”的时候,等价于"....",匹配4个字符的id。 
没“.”的时候,等价于"...",匹配3个字符的id。 
 
 
======================================================= 
 
第三节:数量贪婪符:“+”号,“*”号。 
“+”和“*”,用来修饰 前面一个东西的数量。不占字符位置。 
被“+”修饰的东西,出现1次到无限次。所以这是贪婪。 
被“*”修饰的东西,出现0次到无限次。所以这也是贪婪。 
 
======================================================= 
第四节:数量限制符 { },限制前面的东西的数量,不占字符位置。 
 
有的时候,我们可能会碰到这样的问题: 
有这样一段字符串: 
var 源字符串 = "a=1010;a=msdn;a=1314;a=vs2013;" 
我想匹配字符串的: 
“1010”、“msdn”、“1314”和“vs2013”。 
然后我写了这个表达式 
var 表达式 = "a=(.*);" //圆括号里面的东西,表示一个整体的子表达式。 
var arr=正则表达式匹配(源字符串,表达式,真,真) 
结果……却匹配到了这样一段字符串: 
“1010;a=msdn;a=1314;a=vs2013”。 
 
仔细想想:. 可以匹配分号。这表达式确实可以匹配到这样的结果,但不是我想要的结果。我们该怎么办。 
问题就在于,没有限制 . 出现的数量。 
用{ }去限制前面的东西,出现的数量。 
用法: 
“{n}”前面的东西,限定出现n次。 
“{n,m}”前面的东西,最少出现n次,最多出现m次。 
“{n,}”前面的东西,最少出现n次,最多出现无限次。 
  
返回刚才的问题。 
用“{}”来限定 "."出现4~6次。 
var 表达式 = "a=(.{4,6});"  
这样就可以达到我们的要求。 
  
复习下数量符 ? + * 
? :匹配前面的整体/子表达式 0次或1次。 
例如,"do(es)?" 可以匹配 “do” 或 “does” 中的”do” 。 
? 等价于 {0,1}。 
  
+ :匹配前面的整体/子表达式 1次或多次。 
例如,"zo+" 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。 
+ 等价于 {1,}。 
 
* :匹配前面的整体/子表达式 0次或多次。 
例如,"zo*" 能匹配 “z” 以及 “zoo”。 
* 等价于{0,}。 |