![](/img/trans.png)
[英]Java - regexp - capture digits but only if not preceded by a comparator
[英]Java - Capture optional field with regexp?
我有一個正則表達式可以從字符串結果中正確捕獲值。
正則表達式看起來像;
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,但group(4)必須僅為12:00 。
我希望我能解釋我的問題。
可能希望將最后一組設為可選 :
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]*);)?"
在最后一組(
?:
防止該組被捕獲為輸出。 (
內部)
照常拾取。
也改變了.*?
到[^;\\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]*|)"
正則表達式可能看起來像這樣
intGetHatSaatRenk_v22=anyType\{SiraNo=(.*?); HatKodu=(.*?) ; GunTipi=(.*?); Gidis=(.*?);( RenkGidis=.*?;\s*|\s*)\};
然后,第5組將為“ RenkGidis = 0000FF;”。 要么 ” ”。 然后,您可以使用第二個正則表達式獲得0000FF。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.