【问题标题】:Reading values from Comment Section in Java从 Java 中的注释部分读取值
【发布时间】:2020-02-07 08:52:36
【问题描述】:

我有 Comment 作为输入,我需要从中检索值。我怎样才能做到这一点?

输入评论="service-maintenance,我已收到关于安全气囊召回的联系。我什么时候可以预订?制造:Nissan\n型号:X-TRAIL\n系列:T324\n描述:X- TRAIL Desc\nBodyType : 4X4\n";

我需要从此输入中检索 Make ,Model, Series ,Description ,BodyType

注意:如果值不存在,则应为空。

// Reading Make value from Comment Section
String makevalue = comments.contains("Make :") ? comments.substring(comments.lastIndexOf("Make :"), comments.indexOf("Model :")) : "";
make = makevalue.length() > 0 ? makevalue.substring(makevalue.lastIndexOf(":") + 1) : "";
System.out.println(" Make is ::::::: " + make);
// Reading Model value from Comment Section
String modelvalue = comments.contains("Model :") ? comments.substring(comments.lastIndexOf("Model :"), comments.indexOf("Series :")) : "";
model = modelvalue.length() > 0 ? Modelvalue.substring(modelvalue.lastIndexOf(":") + 1) : "";
System.out.println(" Model is ::::::: " + model);
// Reading Description value from Comment Section
String descvalue = comments.contains("Description :") ? comments.substring(comments.lastIndexOf("Description :"), comments.indexOf("BodyType :")) : "";
description = descvalue.length() > 0 ? descvalue.substring(descvalue.lastIndexOf(":") + 1) : "";
System.out.println(" Description is ::::::: " + description);

当所有值都以相同的顺序(品牌、型号、系列、描述、主体类型)出现时,此示例代码有效

有没有什么有效的方法来实现这一点?

【问题讨论】:

  • 请注意,您应遵循 Java 命名约定:变量名称应以驼峰形式书写。
  • 嗨@MC Emperor,我已根据您的建议使用Java 命名约定更改了变量

标签: java string substring


【解决方案1】:

我会使用正则表达式来做到这一点:

    String comment= "service-maintenance,I have been contacted about an airbag recall. When can I book?Make : Nissan\nModel : X-TRAIL\nSeries : T324\nDescription : X-TRAIL Desc\nBodyType : 4X4\n";
    String pattern = "Make : (.*)\nModel : (.*)\nSeries : (.*)\nDescription : (.*)\nBodyType : (.*)\n";

    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(comment);

    if (m.find( )) {
        //System.out.println(m.group(0));
        System.out.println("Make: "+m.group(1));
        System.out.println("Model: "+m.group(2));
        System.out.println("Series: "+m.group(3));
        System.out.println("Description: "+m.group(4));
        System.out.println("BodyType: "+m.group(5));
     }else {
        System.out.println("NO MATCH");
     }

输出:

Make: Nissan
Model: X-TRAIL
Series: T324
Description: X-TRAIL Desc
BodyType: 4X4

如果您取消注释第一个 syso,您将获得以下输出:

Make : Nissan
Model : X-TRAIL
Series : T324
Description : X-TRAIL Desc
BodyType : 4X4

编辑: 解析可选参数的附加解决方案

    String comment= "service-maintenance,I have been contacted about an airbag recall. When can I book?Make : Nissan\nModel : X-TRAIL\nSeries : T324\nDescription : X-TRAIL Desc\nBodyType : 4X4\n";
    String pattern = "(Make|Model|Series|Description|BodyType) : (.*)\n";
    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(comment);

    while (m.find()) {
        //System.out.println(m.group(0));
        System.out.println(m.group(1) + "=" + m.group(2));
     }

现在的输出是:

Make=Nissan
Model=X-TRAIL
Series=T324
Description=X-TRAIL Desc
BodyType=4X4

如果取消注释 syso 行,则输出相同。当然,您可以删除一些参数,一切都应该按预期工作。如果删除所有参数,则输出将为空。

【讨论】:

  • 嗨@Uata,感谢您的回复。无论评论中存在什么值,都需要检索,例如。如果我从输入中删除模型,则除该模型外,其余值(如 Make、Description exx 检索),在这种情况下,模型为空。 (服务维护,我已收到关于安全气囊召回的联系。我什么时候可以预订?制造:Nissan\n系列:T324\n描述:X-TRAIL Desc\nBodyType:4X4\n";)你可以检查上面的输入
  • @Justin 检查我的编辑。为了满足您的要求,我对模式进行了小幅更新;)
  • 嗨@Uata,我已经尝试了您提供的附加解决方案。它什么也没打印。在调试时,在while循环中它没有出现。你能帮帮我吗??
  • @Justin 啊,是的。对不起。注释字符串中的所有反斜杠在复制过程中都加倍了。现在一切都应该没问题,但请仔细检查评论消息中是否没有多个反斜杠
  • 嗨@Uata,感谢您满足我的要求的编辑答案。
【解决方案2】:
  1. 您可以先根据? 进行拆分,这将为我提供输入参数。
  2. 然后根据\n 进行拆分,这将为我提供参数数组
  3. 根据: 进行拆分,得到 ket 和 value 对。
    注意 这是给定评论的非常具体的解决方案,任何更改都可能会破坏代码。

    String comment = "service-maintenance,I have been contacted about an airbag recall. When can I book?Make : Nissan\nModel : X-TRAIL\nSeries : T324\nDescription : X-TRAIL Desc\nBodyType : 4X4\n";
    
    String[] arr = comment.split("\\?");
    String[] newArr =  arr[1].split("\n");
    
    for (String string : newArr) {
        String[] arrValue = string.split(":");
        System.out.println("key: "+ arrValue[0] +" value: "+ arrValue[1]);
    
    }
    

【讨论】:

  • 嗨@Sumit,感谢您的回复。我需要将检索到的值分配给变量。例如。如果 Input 仅包含 Model 表示,则将该 Model 值分配给 Model Variable。剩余变量的值为空。请告诉我解决方案...
  • @Justin 在 for 循环中,您可以使用 if-else 大小写来检查您的模型的键名,例如 if(arrValue[0].equals("Meke")) 然后分配给该字段等等
  • 嗨@Sumit,明白了。但是我收到了动态内容作为输入,例如,输入类似于(制造:Nissan\nModel : X-TRAIL\nSeries : T324\nDescription : X-TRAIL Desc\nBodyType : 4X4\n")在这种情况下我不能用“?”分割。对吗??你能帮帮我吗?
  • @Justin 如果没有明确的合同,那么没有解决方案将起作用,除非您想创建某种机器学习模型,在传统编程中,您必须对输入的方式有明确的合同,其他明智的,没有任何逻辑会起作用。
  • @Justin 您可以使用#Uata 解决方案在输入前后额外数据方面有更多的灵活性,但这只有在输入不改变参数顺序时才有效
【解决方案3】:

要在分离文本字符串并将其放在上面提到的列表中之后获取值,如果标题始终保持不变,您可以对每个标题的长度进行子字符串化以获得不带空格的值,例如:

public static final int MAKE_LENGHT = ("Make : ").length(); String make = string[0].substring(makeTitle);

结果:make = "Nissan"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2013-06-30
    • 2020-05-18
    相关资源
    最近更新 更多