我正在查找字符串3-431 a4-2 4-13
内部,并希望找到3-431
、a4-2
和4-13
。我使用以下模式:
/(.*-.* )*/gU
我毫无问题地得到了想要的结果:在线演示
问题是,当我想查看以其他子字符串(例如[
和]
)开头和结尾的字符串内部时,如何获得相同的结果。
如果我将subject修改为[3-431 a4-2 4-13 ]
,将regex修改为/'[(.*-.* )*']/gU
,我只得到最后一次出现:4-13
,并且我得到的结果与第一个示例中的结果不同。在线演示
为什么会这样?我该如何解决?
您不需要使用正则表达式,您可以使用explode
或按空格拆分:
$str = "3-431 a4-2 4-13";
$parts = explode(" ", $str);
echo $parts [0]; // 3-431
echo $parts [1]; // a4-2
echo $parts [2]; // 4-13
但是,如果您仍然想使用正则表达式,那么您可以使用:
$re = "/(''w+-''w+)/";
$str = "3-431 a4-2 4-13";
preg_match_all($re, $str, $matches);
Regex演示
顺便说一句,如果你的字符串总是用空格分隔,那么你也可以使用这个正则表达式:
$re = "/(''S+)/";
$str = "3-431 a4-2 4-13";
preg_match_all($re, $str, $matches);
Regex演示
另一方面,如果您的字符串以[
和]
作为[3-431 a4-2 4-13 ]
开始和结束。其想法是利用丢弃技术,您可以使用以下regex:
[[']](*SKIP)(*FAIL)|('S+)
工作演示
此外,使用preg_split
对上面的字符串也得到了相同的结果
$exploded = preg_split('[[']'s]+', '[3-431 a4-2 4-13]', NULL, PREG_SPLIT_NO_EMPTY)
首先,应该使用.+
而不是.*
,因为+
的意思是至少一次。那么您的正则表达式是:
/'[('w+-'w+)*'s*']/sgU
如果您仍然想执行regex,这将起作用:
(^|'])[^[]*'[([^[]*-[^[]* )*(*SKIP)(*FAIL)|(.*-.* )+
基本上,如果发生在[
和]
之外,它将失败。
你只得到一个匹配的原因是,全局修饰符只会在第一个匹配结束后匹配另一个匹配项,在你的情况下是在右大括号之后。