【问题标题】:(Java) get String value after second to the last forward slash and last forward slash(Java) 在倒数第二个正斜杠和最后一个正斜杠之后获取字符串值
【发布时间】:2019-02-25 11:28:27
【问题描述】:

我需要在斜线“/”之后获取某个字符串值,但我遇到了麻烦,因为字符串的格式值并不总是相同。

字符串的值为ff:

String raw = "Announcements/announcement_id)";

我需要的只是 announcement_id,可以使用lastIndexOf("/")+1 获得,但这并不总是字符串的格式,它也可能是这样的。

String raw = "Announcements/announcement_id/Comments/comment_id)";

我只需要 announcement_idcomment_id

最后一部分的字符串值也可以是这样的。

String raw = "Announcements/announcement_id/Comments/comment_id/Replies/reply_id)";

我只需要 comment_idreply_id

我如何像使用 if else 语句一样正确地做到这一点。

if(has only one slash)
   use lastIndexOf("/")+1 to get the id

else if (has three or more slashes)
   get the value after second to the last forward slash and last forward slash

【问题讨论】:

  • 使用 String.split("/") 并检查返回数组的长度
  • 为什么在上一个例子中没有announcement_id?我认为一个正则表达式会起作用
  • @XtremeBaumer 我现在不需要announcement_id
  • 这样的话,Stultuske的想法就是你所需要的

标签: java string


【解决方案1】:

您可以使用此正则表达式,它允许字符串中的可选部分并适当地捕获announcement_idcomment_idreply_id

(?:Announcements/([^/]*))(?:/Comments/([^/]*))?(?:/Replies/([^/]*))?\)

您可以分别通过 group1、group2 或 group3 访问其中的每一个。

并且由于每个部分都是可选的,因此它允许您有选择地拥有 reply_id 而没有commend_id 并且根据您的示例,我已将announcement_id 设为强制性,即使您可以将其设为可选。

Demo

查看此示例 Java 代码,

List<String> list = Arrays.asList("Announcements/announcement_id)",
        "Announcements/announcement_id/Comments/commend_id)",
        "Announcements/announcement_id/Comments/comment_id/Replies/reply_id)");

Pattern p = Pattern.compile("(?:Announcements/([^/]*))(?:/Comments/([^/]*))?(?:/Replies/([^/]*))?\\)");

list.forEach(x -> {
    Matcher m = p.matcher(x);
    if (m.matches()) {
        System.out.println("For string '" + x + "' --> announcement_id: " + m.group(1) + ", commend_id: "
                + m.group(2) + ", reply_id: " + m.group(3));
    }
});

根据找到的适当打印数据,

For string 'Announcements/announcement_id)' --> announcement_id: announcement_id, commend_id: null, reply_id: null
For string 'Announcements/announcement_id/Comments/commend_id)' --> announcement_id: announcement_id, commend_id: commend_id, reply_id: null
For string 'Announcements/announcement_id/Comments/comment_id/Replies/reply_id)' --> announcement_id: announcement_id, commend_id: comment_id, reply_id: reply_id

【讨论】:

    【解决方案2】:
    String s = "Announcements/announcement_id/Comments/comment_id/Replies/reply_id";
    String[] h = s.split("\\/");
    switch (h.length) {
    case 2:
        System.out.println(h[1]);
        break;
    case 4:
        System.out.println(h[1] + " " + h[3]);
        break;
    case 6:
        System.out.println(h[3] + " " + h[5]);
        break;
    default:
        break;
    
    }
    

    此代码还提供了如何在拆分后继续,以及访问您需要的元素的方法

    【讨论】:

    • 哇!谢谢你让它更简单。我只想问为什么 \\/ 而不仅仅是 / ?
    • String#split() 使用正则表达式。 \` the double backslash escapes the /` 正斜杠并确保您不会得到一些随机结果
    • 在 Java 正则表达式中,您不需要转义 / (不像在大多数其他语言/工具中您需要这样做,因为默认正则表达式分隔符是 /,您甚至可以更改以避免也可以在那里转义/)并且可以像这样简单地拆分它s.split("/");
    • 好的,我现在检查一下,IDE 说正则表达式会导致冗余,这意味着 split("\\/") 和 split("/") 始终相同。
    • @PushpeshKumarRajwanshi 这可能适用于 Java,但 PHP 和 JavaScript 无法解析未转义的正斜杠
    【解决方案3】:

    您的 pathParams 顺序是预先定义的,因此请使用 split 并解析数组。

     String s = "Announcements/announcement_id/Comments/comment_id/Replies/reply_id)";
     String [] pathParams = s.split("/");
    

    【讨论】:

    • 谢谢,这正是我所需要的。
    【解决方案4】:

    以下方法适用于更多路径

    String s = "Announcements/announcement_id/Comments/comment_id/Replies/reply_id)";
    String[] paths = s.split("/");
    
    if (paths.length % 2 == 0) {
      if (paths.length == 2) {
        System.out.println(paths[1]);
      } else {
        int lastPos = paths.length - 1;
        int beforeLastPos = lastPos - 2;
        System.out.println(paths[beforeLastPos] + " " + paths[lastPos]);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2022-11-13
      • 2015-06-18
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多