多个正则表达式模式需要开始 ^ 和结束 $
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] => #anystring
[1] => anystring
)
Array
(
[0] => [name=anystring]
[1] =>
[2] => anystring
)
您可以使用非捕获组组合 2 个正则表达式:
(?:pattern1|pattern2)
我写了这个正则表达式,它将捕获两个字符串:
(?:\[\w+=(?<bracketword>\w+)\]|\#(?<word>\w+))
您的匹配项将包含数组键括号词或单词。
在下面的 regex101 link 上查看。
https://regex101.com/r/AmgHTS/1/
您也可以根据需要使用开始和结束字符串 ^ 和 $。在我编辑的正则表达式中,我的测试字符串是两行(每个字符串一行),所以我也必须使用多行标志。
您正在寻找 branch reset group,其中捕获组的编号从组之前的最后一个 ID 开始:
^(?|#(.+)|\[name=(.+)])$
^^
详情
^
- 字符串开头
(?|
- 分支重置组的开始
#(.+)
- a #
然后第 1 组 capturin 1+ 个字符,尽可能多
|
- 或
\[name=
- [name=
子串
(.+)
- 第 1 组(再次)匹配除换行符以外的 1+ 个字符,尽可能多
]
- 一个]
)
- 分支重置组结束
$
- 字符串结尾。
要仅捕获 anything
,同时使用 Lookbehind
,如下所示:
(?<=#|name=)([^\[#\]]+)
https://regex101.com/r/AmgHTS/4/
更多检查:
如果给定 [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] => #anystring
[1] => anystring
)
Array
(
[0] => [name=anystring]
[1] =>
[2] => anystring
)
您可以使用非捕获组组合 2 个正则表达式:
(?:pattern1|pattern2)
我写了这个正则表达式,它将捕获两个字符串:
(?:\[\w+=(?<bracketword>\w+)\]|\#(?<word>\w+))
您的匹配项将包含数组键括号词或单词。 在下面的 regex101 link 上查看。
https://regex101.com/r/AmgHTS/1/
您也可以根据需要使用开始和结束字符串 ^ 和 $。在我编辑的正则表达式中,我的测试字符串是两行(每个字符串一行),所以我也必须使用多行标志。
您正在寻找 branch reset group,其中捕获组的编号从组之前的最后一个 ID 开始:
^(?|#(.+)|\[name=(.+)])$
^^
详情
^
- 字符串开头(?|
- 分支重置组的开始#(.+)
- a#
然后第 1 组 capturin 1+ 个字符,尽可能多|
- 或\[name=
-[name=
子串(.+)
- 第 1 组(再次)匹配除换行符以外的 1+ 个字符,尽可能多]
- 一个]
)
- 分支重置组结束$
- 字符串结尾。
要仅捕获 anything
,同时使用 Lookbehind
,如下所示:
(?<=#|name=)([^\[#\]]+)
https://regex101.com/r/AmgHTS/4/
更多检查: