免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1383 | 回复: 0
打印 上一主题 下一主题

正则表达式知识 及 实践 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-14 09:54 |只看该作者 |倒序浏览

                                字符 描述
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\' 匹配 "" 而 "\(" 则匹配 "("。
^
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
*
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n}
n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}
n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}
m 和 n 均为非负整数,其中n [color="#000000"]贪婪模式:[color="#000000"]
[color="#000000"]前面在元字符中提到过[color="#000000"]"?"[color="#000000"]还有一个重要的作用,即[color="#000000"]"[color="#000000"]贪婪模式[color="#000000"]"[color="#000000"],什么是[color="#000000"]"[color="#000000"]贪婪模式[color="#000000"]"[color="#000000"]呢?[color="#000000"]
[color="#000000"]比如我们要匹配以字母[color="#000000"]"a"[color="#000000"]开头字母[color="#000000"]"b"[color="#000000"]结尾的字符串,但是需要匹配的字符串在[color="#000000"]"a"[color="#000000"]后面含有很多个[color="#000000"]"b"[color="#000000"],比如[color="#000000"]"a bbbbbbbbbbbbbbbbb"[color="#000000"],那正则表达式是会匹配第一个[color="#000000"]"b"[color="#000000"]还是最后一个[color="#000000"]"b"[color="#000000"]呢?如果你使用了贪婪模式,那么会匹配到最后一个[color="#000000"]"b"[color="#000000"],反之只是匹配到第一个[color="#000000"]"b"[color="#000000"]。[color="#000000"]
    [color="#000000"]使用非贪婪模式的表达式如下:[color="#000000"]
/a.+?b/
/a.+b/U
[color="#000000"]使用贪婪模式的如下:[color="#000000"]
/a.+b/
[color="#000000"]上面使用了一个修饰符[color="#000000"]U[color="#000000"],详见下面的部分。
[color="#000000"]修饰符:[color="#000000"]
   
[color="#000000"]在正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着[color="#000000"]"e"[color="#000000"]并不等于[color="#000000"]"E"[color="#000000"])。正则表达式里面的修饰符如下:[color="#000000"]
i [color="#000000"]:如果在修饰符中加上[color="#000000"]"i"[color="#000000"],则正则将会取消大小写敏感性,即[color="#000000"]"a"[color="#000000"]和[color="#000000"]"A" [color="#000000"]是一样的。[color="#000000"]
m[color="#000000"]:默认的正则开始[color="#000000"]"^"[color="#000000"]和结束[color="#000000"]"$"[color="#000000"]只是对于正则字符串如果在修饰符中加上[color="#000000"]"m"[color="#000000"],那么开始和结束将会指字符串的每一行:每一行的开头就是[color="#000000"]"^"[color="#000000"],结尾就是[color="#000000"]"$"[color="#000000"]。[color="#000000"]
s[color="#000000"]:如果在修饰符中加入[color="#000000"]"s"[color="#000000"],那么默认的[color="#000000"]"."[color="#000000"]代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符![color="#000000"]
x[color="#000000"]:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。[color="#000000"]
e[color="#000000"]:本修饰符仅仅对于[color="#000000"]replacement[color="#000000"]有用,代表在[color="#000000"]replacement[color="#000000"]中作为[color="#000000"]PHP[color="#000000"]代码。[color="#000000"]
A[color="#000000"]:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说[color="#000000"]"/a/A"[color="#000000"]匹配[color="#000000"]"abcd"[color="#000000"]。[color="#000000"]
E[color="#000000"]:与[color="#000000"]"m"[color="#000000"]相反,如果使用这个修饰符,那么[color="#000000"]"$"[color="#000000"]将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。[color="#000000"]
U[color="#000000"]:和问号的作用差不多,用于设置[color="#000000"]"[color="#000000"]贪婪模式[color="#000000"]"[color="#000000"]。
$out=
                                       
                                               
                                       
                                        2550
                                       
       
                                       
                                               
                                       
                                        2210
                                       
eot;
//preg_match_all("/\s*(\d+)\s*/is",$out,$match);
//echo $out;
preg_match_all("/\s*(.+?)\s*/is",$out,$match);
  //$match[1] = explode(" ",trim(strip_tags($pricevalue)));
print_r($match);
问题:我这里使用 .+? 得到的却是非贪婪的结果,而使用 .+ 得到的是贪婪的结果。上面叙述好像有问题哦
+? 是非贪婪量词
==============================================网络上的一个例子===========================
view plain
copy to clipboard
print
?
$word = "abcdefghig";  echo preg_replace("/abc(.+?)g/i","\\1",$word);  $word = "abcdefghig";
echo preg_replace("/abc(.+?)g/i","\\1",$word);
out --> defhig      我以为是def
cfang 评注:  结果是正确的,成功匹配了,def 所以 结果是: defhig(不是defghig)
view plain
copy to clipboard
print
?
$word = "abcdefghig";  echo preg_replace("/abc(.+)g/i","\\1",$word);  $word = "abcdefghig";
echo preg_replace("/abc(.+)g/i","\\1",$word);
out --> defghi  正确
希望大家可以帮忙分析一下,谢谢!!!  
===================================================================
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/50970/showart_1414260.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP