php正则表达式加号

时间:2013-06-20 20:55:38

标签: php regex

我正在玩PHP Regex以提高我的技能。

我很难理解加号 - 所以我写了下面的代码:

$subject = 'aaa bbb cccc dddd';
echo preg_replace('/(\w)/',"$1*",$subject) . '<br>';
echo preg_replace('/(\w+)/',"$1*",$subject) . '<br>';
echo preg_replace('/(\w)+/',"$1*",$subject) . '<br>';

结果如下:

a*a*a* b*b*b* c*c*c*c* d*d*d*d*
aaa* bbb* cccc* dddd*
a* b* c* d*

我不明白为什么会出现这些结果。有人可以解释一下这个例子中发生了什么

2 个答案:

答案 0 :(得分:1)

在正则表达式中,+表示one or more of the preceding character or group

模式/(\w)/,表示在单个组中匹配单个单词字符(a-zA-Z0-9_)。所以它会匹配每个字母。第一个匹配组将只是a。替换将用该字母后跟星号替换每个单独的字母。

模式/(\w+)/将匹配组中的一个或多个单词字符。所以它将匹配每个字母块。第一个匹配组将为aaa。替换将替换每个多个字母的块后跟一个星号。

最后一个模式/(\w)+/稍微有点棘手,但会匹配组中的单个字符,但+表示它会匹配一个或多个组。因此,第一个匹配将是a,但替换将替换所有组,直到与最后一个匹配组(当然后跟星号)不匹配为止。因此,如果您尝试使用字符串aaab ccc,则结果最终会为b* c*b是第一个序列中最后一个匹配的组,因此替换将使用它。

答案 1 :(得分:0)

你的错误不是加号,而是了解治疗的目的是什么以及它是如何起作用的。括号用于将匹配分组为变量,因此为什么你可以做$ 1,第二组()给你$ 2等等......

  • (\ w)表示1个字符
  • (\ w +)表示1个或多个单词字符
  • (\ w)+匹配1个或多个单词字符,但只有第一个字符被放入变量中,因为只有\ w在paranthesis中