Java - 使用正则表达式捕获可选字段?

时间:2014-01-04 01:00:57

标签: java android 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 的可选字段,如果它不是null,我如何从RenkGidis获取该值?

使用我上面写的正则表达式代码,如果RenkGidis存在于group(4)中,我可以得到 12:00; RenkGidis = 0000FF 但是组(4)必须只有 12:00

我希望我能解释一下我的问题。

2 个答案:

答案 0 :(得分: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] - >任何字符,即无空格或;


正如Alan在评论中提到的那样,没有获得可选部分的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]*|)"

答案 1 :(得分:0)

正则表达式看起来像这样

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

第5组将是“RenkGidis = 0000FF;”要么 ” ”。然后,您可以使用第二个正则表达式获得0000FF。

相关问题