多个正则表达式模式需要开始 ^ 和结束 $

Is start ^ and end $ required for multiple regex patterns

如果给定 [name=anystring]#anystring 其中 anystring 是一个已经删除了任何空格的字符串,我希望 return anystring.

在尝试两者之前,我分别成功地执行了它们。

$pattern = "/^#(.+)$/";
preg_match($pattern, '#anystring', $matches);
preg_match($pattern, '[name=anystring]', $matches);

$pattern = "/^\[name=(.+)\]$/";
preg_match($pattern, '#anystring', $matches);
preg_match($pattern, '[name=anystring]', $matches);

然后我尝试将它们组合起来。

# with start ^ and end $ on both
$pattern = "/^#(.+)$|^\[name=(.+)\]$/";
preg_match($pattern, '#anystring', $matches);
preg_match($pattern, '[name=anystring]', $matches);

# without start ^ and end $ on both
$pattern = "/^#(.+)|\[name=(.+)\]$/";
preg_match($pattern, '#anystring', $matches);
preg_match($pattern, '[name=anystring]', $matches);

虽然我 "kind of" 得到了我要找的东西,但第二个模式 [name=(.+)] return 是一个包含三个元素的数组。

我应该在第一个模式之后 $ 结束,在第二个模式之前开始 ^ 吗?这会导致第二个模式 returning 一个包含三个元素的数组吗?

编辑。显示一个版本如何显示更多的数组元素

<?php

$pattern = "/^(?:#(.+)|\[name=(.+)\])$/s";
preg_match($pattern, '#anystring', $matches);
print_r($matches);
preg_match($pattern, '[name=anystring]', $matches);
print_r($matches);

(
    [0] =&gt; #anystring
    [1] =&gt; anystring
)
Array
(
    [0] =&gt; [name=anystring]
    [1] =&gt; 
    [2] =&gt; anystring
)

您可以使用非捕获组组合 2 个正则表达式:

(?:pattern1|pattern2)

我写了这个正则表达式,它将捕获两个字符串:

(?:\[\w+=(?<bracketword>\w+)\]|\#(?<word>\w+))

您的匹配项将包含数组键括号词或单词。 在下面的 regex101 link 上查看。

https://regex101.com/r/AmgHTS/1/

您也可以根据需要使用开始和结束字符串 ^ 和 $。在我编辑的正则表达式中,我的测试字符串是两行(每个字符串一行),所以我也必须使用多行标志。

https://regex101.com/r/AmgHTS/2/

您正在寻找 branch reset group,其中捕获组的编号从组之前的最后一个 ID 开始:

^(?|#(.+)|\[name=(.+)])$
  ^^

regex demo

详情

  • ^ - 字符串开头
  • (?| - 分支重置组的开始
    • #(.+) - a # 然后第 1 组 capturin 1+ 个字符,尽可能多
    • | - 或
    • \[name= - [name= 子串
    • (.+) - 第 1 组(再次)匹配除换行符以外的 1+ 个字符,尽可能多
    • ] - 一个]
  • ) - 分支重置组结束
  • $- 字符串结尾。

要仅捕获 anything,同时使用 Lookbehind,如下所示:

(?<=#|name=)([^\[#\]]+)

https://regex101.com/r/AmgHTS/4/

更多检查:

https://regex101.com/r/AmgHTS/5