php正则表达式加号

php正则表达式加号,php,regex,Php,Regex,我正在使用PHP正则表达式来提高我的技能 我很难理解加号,所以我写了以下代码: $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>';

我正在使用PHP正则表达式来提高我的技能

我很难理解加号,所以我写了以下代码:

$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>';

我不明白为什么会有这些结果。有人能解释一下这个例子中发生了什么吗?

你的错误不是加号,而是理解了父母的作用以及它是如何工作的。括号用于将匹配项分组为一个变量,因此您可以使用$1,第二组()为您提供$2,依此类推

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

在正则表达式中,
+
表示前面的一个或多个字符或组

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

模式
/(\w+)/
将匹配组中的一个或多个单词字符。因此,它将匹配每个字母块。第一个匹配组将是
aaa
。“替换”将替换每个多个字母块,后面跟着一个星号


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

我仍然不理解最后一个。假设我们有$subject=“abc def”,这将导致“c*f*”,所以。。。6组匹配{“a”、“b”、“c”、“d”、“e”、“f”}现在您的意思是a*应该返回,但被b*覆盖,b*被c*覆盖-其他三组的过程相同吗?为什么?组外的
+
表示匹配一个或多个组。一旦不匹配(空格或字符串结尾),replace将用最后一个匹配的组替换所有匹配的组。因此,在
abc
中找到的3个组将替换为最后一个匹配,即
c
。另一种解释是:正则表达式引擎将从左到右一次匹配一个字符。它将从表达式的第一部分开始,即
(\w)
<代码>a,匹配和引擎将继续。它将找到
b
,匹配并继续。它将找到
c
,匹配并继续。它将找到空间而不是匹配。然后,它将展开表达式,以包含将匹配abc的+。表达式结束,因此将查找替换
$1
将等于
c
,因为这是最后一个匹配的组,它将替换到目前为止匹配的所有
abc
。然后继续字符串的其余部分。@Neverhopess,新标记是什么?请解释为什么要用它替换
regex
php
标记。@Charles,我遇到过用户提出的regex问题,这些问题大多属于PHP和ASP.Net,用于验证用户输入或解析xml/json响应,有时人们只提到
regex
标记,而没有指定编程语言。因此,它是两个实体的组合表示,有助于同时表示这两个实体。除了这两个标记外,我不会创建组合标记,因为它们经常被使用。@拥有标记的目标之一是允许对问题进行分类。SO社区决定所有正则表达式问题都属于
regex
标签。仅仅为PHP正则表达式问题创建一个孤岛是完全不合适的,因为它会损害问题分类。在重要的时候,只包含language标签是非常好的。使用中的大多数正则表达式遵循POSIX或Perl标准,因此大多数情况下,实际的正则表达式语法/环境并不重要。
a*a*a* b*b*b* c*c*c*c* d*d*d*d*
aaa* bbb* cccc* dddd*
a* b* c* d*