+ -
当前位置:首页 → 问答吧 → 关于PHP正则表达式中星号的问题

关于PHP正则表达式中星号的问题

时间:2009-01-20

来源:互联网

正则表达式中 *号表示 重复0次或多次
                              +号表示 重复1次或多次

一般*号和+号用在表示多个重复字符 例如:
kkkkkkkk
用+表示号   k+
用*号表示    k*

一般情况下要被匹配的字符在符号的前面

现在我要问的是*号既然可以匹配0次 是不是就可以表示任意字符?

例如 a*e 匹配 abcde  但是 我发现 这个表达式却匹配了e 单个字符

现在被匹配的字符却在符号的后面[code] echo ereg_replace('a*e','[re]','abcde');[/code]输出      abcd[re]

而当我写出下面一个表达式时我更高不懂*这个符号是什么意思了..[code]echo ereg_replace('a*','[re]','abcde');[/code]输出    [re][re]b[re]c[re]d[re]e[re]


谁能解释下*号的用法·····谢谢了

作者: lk188   发布时间: 2009-01-20

1.
[php]echo ereg_replace("a","[re]","abcde");[/php]
输出:
[re]bcde
这里精确匹配一个a

2.
[php]
echo ereg_replace("a*","[re]","abcde");
[/php]
这句输出:
[re][re]b[re]c[re]d[re]e[re]
在这里我理解为:
abcde中首先匹配一个a,换成[re];接着匹配0个a,换成[re];接着是b;接着匹配0个a,换成[re];……
最后得到[re][re]b[re]c[re]d[re]e[re]
至于为什么0个a换成[re],个人理解需要了解ereg_replace函数一下。

3.
[php]
echo ereg_replace("a*e","[re]","abcde");
[/php]
输出:
abcd[re]
此处abcde中e满足:0个a1个e的匹配,所以换成abcd[re]

4.
综上可以了解在ereg_replace函数中,字符和字符之间存在着“没有字符”,即对于代码
[php]
echo ereg_replace("1*","[re]","abcde");[/php]
来说,输出为:
[re]a[re]b[re]c[re]d[re]e[re]
则说明“没有字符”匹配了"1*"
而对于代码
[php]
echo ereg_replace("1+","[re]","abcde");[/php]
来说,因为没有匹配至少一个1的字符串在abcde中,所以输出为:
abcde

不知道这样的回答是否令你满意。个人理解,仅供参考。

作者: casual0402   发布时间: 2009-01-22

顶楼上的来了回复:你看一下《精通正则表达》一书的第四章“表达式匹配原理”。
这里有两原则:
1. 优先选择最左端的匹配结果。
2.标准的匹配量词(*,+,?,{m,n}是匹配优先的。

作者: cnkiller   发布时间: 2009-01-25