正则表达式教程三 —— 元字符
2017-12-20 17:11 浏览(1601

快年底了,事儿比较多,自己又在玩 ffmpeg,这个教程三才姗姗来迟

这一节,介绍正则的其它元字符,有些在前面介绍过的,这里就不一一举例了


1、(?:pattern)

匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。

这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。


2、(?=pattern)

肯定顺序环视

正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

例子 12

$s = <<<'TEXT'
windowsXP,windows7,windows10,windows97
TEXT;

preg_match_all('#windows(?=(XP|7|10))#',$s,$m);
echo "<pre>";
print_r($m[1]);
echo "</pre>";
/*
Array
(
    [0] => Array
        (
            [0] => windows
            [1] => windows
            [2] => windows
        )

    [1] => Array
        (
            [0] => XP
            [1] => 7
            [2] => 10
        )

)
*/

记住环视是不会捕获内容的,也就是以 (? 开头的表达式,所以这里为 (XP|7|10) ,这个括号就是为了捕获 xp,7,10


3、(?!pattern)

否定顺序环视

负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始


将例子 12 中的表达式改一下

preg_match_all('#windows(?!(XP|7|10))#',$s,$m);

可以匹配 windows97


4、\b

匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。


5、\B

和\b 相反,匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。


6、\d 

常用

匹配一个数字字符。等价于 [0-9]。 字符集在第一节的时候已经讲过


7、\D

匹配一个非数字字符。等价于 [^0-9]。 


8、\n 

常用

匹配一个换行符,windows下的换行符是 \r\n,linux 下是 \n


例子13

$s = <<<'TEXT'
第一行
第二行
第三行
TEXT;

echo preg_replace('#\r\n|\n#','|enter|',$s);
//第一行|enter|第二行|enter|第三行

将换行符替换为 |enter|,在php 中有个内置常量,可以自动识别用哪一种换行模式——PHP_EOL

echo preg_replace('#'.PHP_EOL.'#','|enter|',$s);

这样也能达到同样的效果,还方便


9、\r

匹配一个回车符 


10、\t  

匹配一个制表符


11、\v  

匹配一个垂直制表符


12、\f  

匹配一个换页符


13、\s 

常用

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。


14、\S

常用

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 

一般使用 [\s\S] 来匹配任何内容(非空白与空白字符都包含了)


例子14

$s = <<<'TEXT'
<div>abc一二三.+?#</div>
TEXT;

preg_match_all('#<div>([\s\S]+)</div>#',$s,$m);
echo "<pre>";
print_r($m[1]);
echo "</pre>";
/*
Array
(
    [0] => abc一二三.+?#
)
*/


15、\w  

常用

匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 


16、\W  

匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 

我们也可以用 [\w\W] 来匹配任何内容(非单词与单词字符都包含了),但我一般都使用 [\s\S]


用例子14 试一下吧



布置作业啦

$s = <<<'TEXT'
<div>content1 abc一</div><div>content2 5cde八</div><div>content668</div>
TEXT;

用 肯定顺序环视 匹配出 "content1 abc一" 和 "content2 5cde八"

得到的结果如下

Array
(
    [0] => Array
        (
            [0] => <div>content1 abc一</div>
            [1] => <div>content2 5cde八</div>
        )

    [1] => Array
        (
            [0] => 1 abc一
            [1] => 2 5cde八
        )

)


评论(3)
发布评论
回复X
聊天室(0