RegExp 板


LINE

※ [本文转录自 PHP 看板 #1EaPVkLE ] 作者: knuckles (那克斯) 看板: PHP 标题: [分享] PHP官网对於RegExp小括弧()用法的说明 时间: Sun Oct 9 20:47:39 2011 PHP官网写的好难懂,所以来整理一下自己的心得版 PHP官方网站对於 regular expression 的小括号 () 用法的说明页 http://www.php.net/manual/en/regexp.reference.subpatterns.php 我自己写的一点笔记: (网页上色版 http://disp.cc/b/11.cj-1SO9 ) 小括弧有两种用途: 1. 群组各种可能的子字串,例如 /filename\.(jpg|png|gif)/ 这样就可以找到这三种副档名的图档 2. 标记要取得的字串,例如 /a=(.*?)&b=(.*?)&c=(.*?)&d=/ 就可以把 a, b, c 的值分别存到 $1, $2, $3 这两种用途有时候会混在一起,像是 preg_replace("/((red|white) (king|queen))/","$1, $2, $3","red queen"); ← red queen → $1 ← red → $2 ← queen → $3 会得到 red queen, red, queen 如果只想拿()当群组用,但不要被算进要抓的字串,可以在(後加上 ?:,例如 preg_replace("/((?:red|white) (king|queen))/","$1, $2","red queen"); 会得到 red queen, queen (第二个括弧的red不会被抓出来了) ?:中间可以加上选项,例如 i 是忽略大小写 写成 (?i:saturday|sunday) 等同於 (?:(?i)saturday|sunday) 可以符合 SUNDAY 或 Saturday,i的效果仅限於这个() 抓到的字串,除了自动依顺序配给 $数字 外,也可以自己加上名字 语法 (?P<name>pattern) ,在 PHP5.2.2 另外提供了 (?<name>pattern) 及 (?'name'pattern) 两种用法 在当群组用时,若每个可能的字串又有用到标记要抓的字串时 例如 (?:(Sat)ur|(Sun))day 用在 Sunday 时,$1="",$2="Sun" 用在 Saturday 时,$1="Sat,$2不存在 此时可以改用 (?|(Sat)ur|(Sun))day 这样就只会抓到1个字串,$1="Sun" 或 $1="Sat" 至於(?=)、(?!)、(?<=)、(?<!) 是 assertions 的用法 PHP官方网站对於 assertions 的说明 http://www.php.net/manual/en/regexp.reference.assertions.php 我写的一点笔记: (网页上色版:http://disp.cc/b/11.cj-2pRT ) Assertion 用来表达位置的符号,不会吃掉字元 例如 ^ : 符合整个字串的开头;在multiline模式,代表一行的开头 $ : 符合整个字串的结尾;在multiline模式,代表一行的结尾 \b : 符合一个单字边界(word boundary),一边是\w一边是\W \B : 符合一个非单字边界,两边都是\w 或两边都是\W \A : 只符合整个字串的开头 (不受multiline模式影响) \Z : 只符合整个字串的结尾,或是结尾换行前 (不受multiline模式影响) \z : 只符合整个字串的结尾 (不受multiline模式影响) \G : 若使用preg_match有设offset时,代表offset的位置,offset为0时就与\A相同 如果是要表达前後是否为某个字串,但不要把这字串抓进来的话,有分为 Lookahead 看後面 (?=abc) : 接下来必需是abc (?!abc) : 接下来不能是abc Lookbehind 看前面 (?<=abc) : 前面是接abc (?<!abc) : 前面不是接abc 举例 \w+(?=;) 只会抓到後面有接;的\w+,但不会把;抓进来 foo(?!bar) 会抓到所有後面不是接bar的foo (?!foo)bar 错误用法,这样所有的bar都会抓到 如果想要前面不是接foo的话,要用Lookbehide的用法 (?<!foo)bar 这样才对,会抓到所有前面不是接foo的bar 可以使用(?<=bullock|donkey)来抓前面是bullock或donkey的字串 但要注意lookbehind的用法时,所有匹配的字串可以分别为不同长度, 但每个必需是固定的长度,例如 (?<!dogs?|cats?) 就不行 要匹配不同长的字串也仅至於最上层的分支, 像 (?<=abc|abde) 可以,但 (?<=ab(c|de)) 就不行 Assertions可以连续使用 例如 (?<=\d{3})(?<!999)foo 可以抓到前面是3个非999数字的foo 注意这两个assertions都是检查同一个位置,所以不会抓到前面接6个字元的foo 像 123abcfoo 的foo就不会被抓到,如果要抓像这样的foo, 要用(?<=\d{3}...)(?<!999)foo Assertions可以巢状使用 例如 (?<=(?<!foo)bar)baz 可以抓到 前面是 bar 且 bar 的前面不是 foo 的 baz 例如 (?<=\d{3}...(?<!999))foo 可以抓到 前面是 3个数字与3个非999字元 的foo --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.248.11.75 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.248.11.75
1F:推 PurpleCrow:good! 10/10 17:15
2F:推 mars90226:最後一个范例有点不懂...(?<!999)不是要放在某字串之前? 10/11 22:48
(?<=\d{3}...(?<!999))foo 意思就是说 (?<!999)前面那三个点不可以是999 当然也可以改成 (?<=\d{3}...)(?<!999)foo 代表 foo前面不可以是999 这两个是一样的结果,举这个例子就是要说两种用法都可以吧 lookbehind不一定只能放在字串前,lookahead也不一定只能放字串後 例如 (?!foo)... 可以用来表示 ... 不可以是foo ※ 编辑: knuckles 来自: 111.248.0.200 (10/12 00:23)
3F:推 mars90226:了解了!感谢分享! 10/14 20:37







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP