【问题标题】:Get certain substring from a string value从字符串值中获取某个子字符串
【发布时间】:2014-01-24 02:51:29
【问题描述】:

我有以下日期:

"Friday, January 31",
"Wednesday, February 12",
"Monday, February 17",
"Wednesday, March 5",

我想设置一个字符串函数,总是给我一个数字:

31
12
17
5

我从这个函数开始:

String strCheck = suspendedDates[i];
int pos = strCheck.length();
int pos2 = strCheck.indexOf(" ");

我现在卡住了,因为它怎么知道是哪个" "

谁能帮我完成这个功能。

【问题讨论】:

  • 如文档所述,它将采用第一个。 "返回此字符串中第一次出现指定子字符串的索引。"

标签: java android substring


【解决方案1】:

使用lastIndexOf() 代替indexOf()

final String str = "Friday, January 31";
System.out.println(str.substring(str.lastIndexOf(" ")));

【讨论】:

    【解决方案2】:

    从末尾获取子字符串。而不是试图找出位置

    strCheck.substring(strCheck.length()-2);
    

    这将使用最后两个字符。然后只需执行 trim() 以防它是单个字符来删除空格:-

    strCheck.substring(strCheck.length()-2).trim();
    

    替代方案

    提到的另一个选项是在String 上使用空格(“”)作为参数执行lastIndexOf(),它将从String 的末尾向后搜索直到找到空格。但是由于数字总是可以在 2 个字符空间中提取,我认为没有理由每次您想在已知位置 (length()-2) 中提取已知大小 String (2) 以便检索时进行 2 个字符比较您已经知道的位置。

    【讨论】:

    • 如果他只需要查找最后一个数字,则无需修改字符串。如果格式是不变的,那就做:太多的代码。只需使用 s.substring(c.lastIndexOf(" "), s.length())
    • 我的代码转到给定的索引并提取所需的String,您的代码将从String 的末尾向后搜索进行比较,直到找到“”。如果没有可选的trim(),我的代码实际上效率更高。
    • 查看trim里面的代码量,包括本例中不必要的代码。但很可能差异并不显着。让我们运行一百万次。
    【解决方案3】:

    如果您尝试将字符串分成几部分进行解析,我建议使用 String.split(" "),查看 javadocs 和 Internet 以获取大量使用中的不错示例! :)

    【讨论】:

      【解决方案4】:

      作为@JigarJoshi 答案的替代方案,如果您不介意,您可以使用正则表达式,删除所有非数字字符。

      String result = dateString.replaceAll("[^\\d]+","");
      

      【讨论】:

      • 太多的代码 + 一个正则表达式是一件很沉重的事情。如果他只需要得到最后一个数字并且格式相同,他应该使用:代码太多。只需使用 s.substring(c.lastIndexOf(" "), s.length())
      • @DanielNuriyev 我不知道格式是否总是相同的,但另一方面你是对的,这就是为什么我以“作为替代”开始我的回答;)我不会复制粘贴其他已经回答的内容
      【解决方案5】:

      你可以这样使用:

       String str = "Friday, January 31";
       Scanner s = new Scanner(s);
       s.useDelimiter( "\\D+" );
       while ( s.hasNextInt() ){
         s.nextInt(); // get int
       }
      

      【讨论】:

      • 代码太多。只需使用 s.substring(c.lastIndexOf(" "), s.length())
      • 但如果您以后想提取更多信息或更改格式,效果会更好。
      【解决方案6】:

      我不得不发布它;因为这是一个日期,所以我会使用 Date parse 以允许对输入格式进行额外检查:

      另一种方式:

      SimpleDateFormat format = new SimpleDateFormat("EEEE, MMMM DD");
      Calendar cal = Calendar.getInstance();
      
      cal.setTime(format.parse("Friday, January 31"));
      System.out.println(new SimpleDateFormat("DD").format(cal.getTime()));
      

      使用第二个SimpleDateFormat("DD") 代替已弃用的getDate()

      【讨论】:

      • +1 如果格式始终相同,这是使用 SimpleFormatDate 的更多 oop 解决方案,
      • @nachokk 谢谢,是的,我可以,我猜总有一个范围 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      相关资源
      最近更新 更多