【问题标题】:Java - Capture optional field with regexp?Java - 使用正则表达式捕获可选字段?
【发布时间】:2014-01-21 19:42:31
【问题描述】:

我有一个正则表达式,可以正确地从字符串的结果中捕获值。

正则表达式看起来像;

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

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

【问题讨论】:

    标签: java android regex


    【解决方案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 在 cmets 中提到的,因为没有得到可选部分的 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,但如果没有 RenkGidis 字段 group(5) 将为空,所以你需要检查。
    • @Alan Moore 很高兴你喜欢它,添加了一个替代方案 :)
    • 这正是我想做的,我在正则表达式上学到了新东西。谢谢你,我真的很感激。
    【解决方案2】:

    正则表达式可能如下所示

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

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

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 2013-07-31
      • 1970-01-01
      相关资源
      最近更新 更多