2013-09-11 2 views
0

Сервер отправляет мне строку, представляющую некоторые фигуры.Группирование регулярных выражений: числа, разделенные пробелами

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

Давайте возьмем прямоугольник один.

<RECTANGLE> 157 20 225 99 </RECTANGLE> 

Теперь мне нужно получить эти группы, когда я EXEC мое регулярное выражение:

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 " 

Так это работает только тогда, когда есть только один (пробел) номер (пробелы) в строке.

Может кто-нибудь помочь исправить мое регулярное выражение, чтобы оно получило все (пробелы) в строке.

ответ

0

Вы не можете захватить переменное число элементов в группы захвата, потому что они перекрывают друг друга.

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

Второй захват группа (\d+) захватывает ряд в \ 2, но повторять согласование с внешней группой будет перезаписывать \ 2 с последующими числами так, в конце концов, \ 2 будет содержать последний согласованный номер.

Вы должны сделать это в два этапа. Сначала извлеките весь набор чисел, а затем отдельно извлеките из этого числа.

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

который получит что-то вроде «157 20 225 99» в \ 2, которые затем можно разделить на пространствах, чтобы получить индивидуальные номера.

0

пространство \040 Я рекомендую и использовать взрываются/разделить/и т.д., потому что его лучше, чем регулярное выражение на этом примере

+0

Я немного изменил регулярное выражение на <(.*?)> (\ S +) +, и теперь я получаю последний. Я читал, что, если он не находится в .net, группа становится выше. Это также относится к java ?, а если нет, использование регулярного выражения является критерием работы, которую я должен выполнить, поэтому я не могу использовать string.split(). –

Смежные вопросы