获取字符之间的所有出现次数以获得相同的结果


Get all occurences between characters to get same result

我正在查找字符串3-431 a4-2 4-13内部,并希望找到3-431a4-24-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)|(.*-.* )+

基本上,如果发生在[]之外,它将失败。


你只得到一个匹配的原因是,全局修饰符只会在第一个匹配结束后匹配另一个匹配项,在你的情况下是在右大括号之后。