2014-01-04 2 views
0

У меня есть регулярное выражение, которое правильно фиксирует значения из результата строки.Java - Захват дополнительного поля с регулярным выражением?

regex выглядит так;

intGetHatSaatRenk_v22=anyType{SiraNo=(.*?); HatKodu=(.*?) ; GunTipi=(.*?); Gidis=(.*?); ? }; 

Но проблема заключается в источнике;

intGetHatSaatRenk_v22=anyType{SiraNo=54; HatKodu=502 ; GunTipi=C; Gidis=12:00; RenkGidis=0000FF; }; 

intGetHatSaatRenk_v22=anyType{SiraNo=55; HatKodu=502 ; GunTipi=C; Gidis=12:07; }; intGetHatSaatRenk_v22=anyType{SiraNo=56; HatKodu=502 ; GunTipi=C; Gidis=12:14; }; 

, как вы можете видеть, есть дополнительное поле, которое назвало RenkGidis, как я могу получить значение из RenkGidis, если это не пустые?

с кодом регулярного выражения, который я написал выше, я могу получить, если RenkGidis существует в группе (4), например 12:00; RenkGidis = 0000FF, но группа (4) должна быть только 12:00.

Надеюсь, что я могу объяснить свою проблему.

ответ

1

Может хотите, чтобы сделать последнюю группу optional:

intGetHatSaatRenk_v22=anyType\{SiraNo=([^;\s]*);\s+HatKodu=([^;\s]*)\s*;\s+GunTipi=([^;\s]*);\s+Gidis=([^;\s]*);(?:\s+RenkGidis=([^;\s]*);)? 

Как строка Java:

"intGetHatSaatRenk_v22=anyType\\{SiraNo=([^;\\s]*);\\s+HatKodu=([^;\\s]*)\\s*;\\s+GunTipi=([^;\\s]*);\\s+Gidis=([^;\\s]*);(?:\\s+RenkGidis=([^;\\s]*);)?" 

В последней группе (?:prevents the group to be captured в выходные. ( внутри ) повиден как обычный.

Также изменен .*? к [^;\s]* (отрицание [;\s] -> всех символы, которые не являются не белым пространством или ;)


Как Алан упоминался в комментариях, чтобы не получить null матча за дополнительным часть, например просто сделать RenkGidis опциональные и оберните значение в чередовании с чем: ([^;\s]*;|)

intGetHatSaatRenk_v22=anyType\{SiraNo=([^;\s]*);\s+HatKodu=([^;\s]*)\s*;\s+GunTipi=([^;\s]*);\s+Gidis=([^;\s]*);(?:\s+RenkGidis=)?([^;\s]*|) 

как строка Java:

"intGetHatSaatRenk_v22=anyType\\{SiraNo=([^;\\s]*);\\s+HatKodu=([^;\\s]*)\\s*;\\s+GunTipi=([^;\\s]*);\\s+Gidis=([^;\\s]*);(?:\\s+RenkGidis=)?([^;\\s]*|)" 
+0

+1, но если нет 'RenkGidis' поля' группы (5) ' будет null, поэтому вам нужно это проверить. –

+0

@Alan Moore Happy вам нравится, добавил альтернативу :) –

+0

Это именно то, что я хотел сделать, я узнал новое в regexp. Спасибо, я очень ценю это. –

0

Регулярное выражение может выглядеть следующим образом

intGetHatSaatRenk_v22=anyType\{SiraNo=(.*?); HatKodu=(.*?) ; GunTipi=(.*?); Gidis=(.*?);(RenkGidis=.*?;\s*|\s*)\}; 

Группа 5 будет затем либо "RenkGidis = 0000FF;" или " ". Затем вы можете использовать второе регулярное выражение для получения 0000FF.

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