正则表达式分组:由空格分隔的数字

时间:2013-09-11 20:08:14

标签: regex grouping

服务器向我发送一些表示某些形状的字符串。

<RECTANGLE> 157 20 225 99 </RECTANGLE>
<CIRCLE> 282 301 7 </CIRCLE>

让我们取一个矩形。

<RECTANGLE> 157 20 225 99 </RECTANGLE>

现在我需要在执行我的正则表达式时获取这些组:

myArray[0] = "<RECTANGLE> 157 20 225 99 </RECTANGLE>"
myArray[1] = "RECTANGLE"
myArray[2] = " 157 "
myArray[3] = " 20 "
myArray[4] = " 225 "
myArray[5] = " 99 "

但是我目前的正则表达式:

<(.*?)>( \S+ )+</\1>

它让我回复:

null

如果我使用此输入:

<SQUARE> 55465 </SQUARE>

我只得到:

myArray[0] = "<SQUARE> 55465 </SQUARE>"
myArray[1] = "SQUARE"
myArray[2] = " 55465 "

所以只有在字符串中只有一个(空格)数字(空白)时才有效。

有人可以帮助纠正我的正则表达式,以便它获得字符串中的所有(空格)数字(空格)。

2 个答案:

答案 0 :(得分:0)

空间为\040 我建议你使用explode / split / etc,因为它比本例中的正则表达式更好

答案 1 :(得分:0)

您无法将可变数字元素捕获到捕获组中,因为它们会相互覆盖。

Not working: <(.*?)>\s*(?:(\d+)\s*)*</\1>

第二个捕获组(\d+)在\ 2中捕获一个数字,但是外部组重复匹配将覆盖\ 2后续数字,所以最后\ 2将包含最后匹配的数字。

您必须分两步完成此操作。首先提取整组数字,然后分别从中提取数字。

Intermediate step: <(.*?)>\s*(\d+\s*)*</\1>

这将得到类似“157 20 225 99”的内容到\ 2中,然后您可以在空格上分割以获得单个数字。