我有一个正则表达式,可以正确捕获字符串结果中的值。
正则表达式看起来像;
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 是否存在于 group(4) 中,如 12:00; RenkGidis=0000FF,但 group(4) 必须仅为 12:00。
我希望我能解释我的问题。
最佳答案
可能想要创建最后一组 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 进入输出。(
inside )
像往常一样捕获.
还将 .*?
更改为 [^;\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]*|)"
关于Java - 使用正则表达式捕获可选字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20915479/