簡體   English   中英

Java-使用正則表達式捕獲可選字段?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM