使用preg_match的php正则表达式

使用preg_match的php正则表达式,php,regex,Php,Regex,我正在尝试创建一个php文件,这样它就可以接受word作为正则表达式(a+b)(ab+ba)* 我正在使用preg_match,到目前为止我已经想到了这个 $subject = "a+b"; $pattern = '(([a]{1}\+[b]{1})?([ab]{1}\+[ba]{1}))'; preg_match($pattern, $subject, $matches); print_r($matches); 我不确定我是否完全理解它是如何工作的,但现在我已

我正在尝试创建一个php文件,这样它就可以接受word作为正则表达式(a+b)(ab+ba)* 我正在使用preg_match,到目前为止我已经想到了这个

    $subject = "a+b";
    $pattern = '(([a]{1}\+[b]{1})?([ab]{1}\+[ba]{1}))';
    preg_match($pattern, $subject, $matches);
    print_r($matches);
我不确定我是否完全理解它是如何工作的,但现在我已经花了几个小时试图弄明白。。我如何使它满足我的条件

我想匹配(a+b)(ab+ba)*,其中第一个括号(a+b)是必需的,第二个括号(ab+ba)上的*表示可能有零个或多个实例。 所以它应该是这样工作的

   $subject= "(a+b)"
   Match


   $subject= "(a+b)(ab+ba)"
   Match


   $subject= "(a+b)(ab+ba)(ab+ba)"
   Match

   $subject= "(ab+ba)"
   No Match

   $subject= ""
   No Match
([a]{1}\+[b]{1})中([ab]{1}\+[ba]{1}))

[a]{1}
(a中的1个字符)可以写成
a

[b]{1}
可以写成
b

[ab]
(字符类中的两个字符)表示a或b

我认为你必须跳出开头的括号
\(
),否则你将启动一个捕获组

如果我没有弄错的话,这可能符合您的要求:

第二部分在非捕获组
(?:\(ab\+ba\)*
中,重复零次或多次


您想匹配的内容不太清楚,您可以添加其他示例吗?@casimirithippolyte我已经编辑了原始帖子,请看一看。在您的代码片段中,
$subject
不包含括号,但在接下来的示例中包含括号。哪一个是正确的?我的错,第二个是正确的它必须包含括号,我只是测试它是否适用于a+b,而它不应该也应该只适用于(a+b)。@revoYou需要转义特殊字符
(?:\(a\+b\)(?:\(ab\+ba\)*
这很完美,但还有一个问题它也适用于(a+b)(,(a+b)a等词。就像它适用于(a+b)一样之后呢that@YousufKhan然后你可以在字符串的开头
^
和结尾
$
使用锚。我已经更新了我的答案。是的,它起作用了,我在开头放了$,但它不起作用。