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

标签 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的可选字段,如果它不为空,我如何从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/

相关文章:

java - jackson xmlmapper 用于映射 <String, Object>,对特定标签使用react

java - 查找 java.security.Security 中所有属性的当前状态

java - 创建相机 View 后,Android 自动对焦不起作用

android - 如何在android菜单中同时显示图标和标题

javascript - 用正则表达式替换 ID 号

regex - 从 Hiawatha 移动时出现 FCGI 和 url 问题

java - 索引@MultiField spring-data-elasticsearch。国际化目的

java - 从 Jenkins 将环境变量传递给 Ant build.xml?

Android Surfaceview 线程和内存泄漏

Ruby 在选择 block 中使用正则表达式