日期:2014-05-17  浏览次数:20659 次

请帮忙解释一下这个正则表达式,谢谢!
SQL code

select REGEXP_SUBSTR('<p><img height="284" alt="" width="450" src="/userfiles/image/img.jpg" />请填写内容<img height="284" alt="" width="450" src="/userfiles/image/img2.JPG" /></p>',
  2 '/USERFILES.*?'||'\.JPG',
  3 1,
  4 1,
  5 'i') sd
  6 from dual
  7 ;
--re:
--/userfiles/image/img.jpg



1: '/USERFILES.*?'||'\.JPG' 匹配模式改成: '/USERFILES.*?\.JPG' 结果也一样,分开写实为了便于阅读吗?
2: .*? 去掉人一个符号,都不能得到结果,
3: .?* 将? 和* 换个位置得到的结果是:/userfiles/image/img.jpg" />请填写内容<img height="284" alt="" width="450" src="/userfiles/image/img2.JPG   为什么?

附上:
特殊字符:
'^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
'$' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 'n' 或 'r'。
'.' 匹配除换行符 n之外的任何单字符。
'?' 匹配前面的子表达式零次或一次。
'*' 匹配前面的子表达式零次或多次。
'+' 匹配前面的子表达式一次或多次。
'( )' 标记一个子表达式的开始和结束位置。
'[]' 标记一个中括号表达式。
'{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
'|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。


------解决方案--------------------
这是贪婪匹配和惰性匹配的不同
这里的*?是一个组合符号,不能拆开理解


------解决方案--------------------
贪婪匹配(greedy):它会匹配尽可能多的字符。它首先看整个字符串,如果不匹配,对字符
串进行收缩;遇到可能匹配的文本,停止收缩,对文本进行扩展,当发现匹配的文本时,它
不着急将该匹配保存到匹配集合中,而是对文本继续扩展,直到无法继续匹配 或者 扩展完
整个字符串,然后将前面最后一个符合匹配的文本(也是最长的)保存起来到匹配集合中。所
以说它是贪婪的。 
惰性匹配(lazy):它会匹配尽可能少的字符,它从第一个字符开始找起,一旦符合条件,立
刻保存到匹配集合中,然后继续进行查找。所以说它是懒惰的。

默认使用贪婪匹配,在次数限定元字符后加?转为惰性匹配

? ?? 匹配0个或 1 个 
+ +? 匹配1个或多个 
* *? 匹配0个或多个 
{n} {n}? 匹配n个 
{n,m} {n,m}? 匹配n个或 m 个 
{n,} {n,}? 匹配n个或多个