【问题标题】:In java how to get substring from a string till a character c?在java中如何从字符串中获取子字符串直到字符c?
【发布时间】:2011-10-07 05:41:46
【问题描述】:

我有一个字符串(基本上是遵循命名约定的文件名)abc.def.ghi

我想提取第一个.之前的子字符串(即一个点)

在 java doc api 中,我似乎无法在 String 中找到执行此操作的方法。
我错过了什么吗?怎么做?

【问题讨论】:

    标签: java


    【解决方案1】:

    接受的答案是正确的,但它没有告诉您如何使用它。这就是你如何一起使用 indexOf 和 substring 函数。

    String filename = "abc.def.ghi";     // full file name
    int iend = filename.indexOf("."); //this finds the first occurrence of "." 
    //in string thus giving you the index of where it is in the string
    
    // Now iend can be -1, if lets say the string had no "." at all in it i.e. no "." is found. 
    //So check and account for it.
    
    String subString;
    if (iend != -1) 
    {
        subString= filename.substring(0 , iend); //this will give abc
    }
    

    【讨论】:

    • 这是无效代码,因为您不能在没有大括号的 If 语句的主体中放置变量声明。
    • @Clashoft 这里隐含了大括号。
    【解决方案2】:

    你可以split字符串..

    public String[] split(String regex)
    

    请注意,java.lang.String.split 使用分隔符的正则表达式值。 基本上是这样的……

    String filename = "abc.def.ghi";     // full file name
    String[] parts = filename.split("\\."); // String array, each element is text between dots
    
    String beforeFirstDot = parts[0];    // Text before the first dot
    

    当然,为了清晰起见,这分为多行。可以写成

    String beforeFirstDot = filename.split("\\.")[0];
    

    【讨论】:

      【解决方案3】:

      查看String.indexOfString.substring

      确保为 indexOf 检查 -1。

      【讨论】:

        【解决方案4】:

        如果你的项目已经使用commons-lang,StringUtils 提供了一个很好的方法来实现这个目的:

        String filename = "abc.def.ghi";
        
        String start = StringUtils.substringBefore(filename, "."); // returns "abc"
        

        参见 javadoc [2.6] [3.1]

        【讨论】:

          【解决方案5】:

          或者你可以尝试类似的东西

          "abc.def.ghi".substring(0,"abc.def.ghi".indexOf(c)-1);

          【讨论】:

          • 将崩溃的 'c' 不在字符串中,因为 indexOf 将返回 -1
          • @Umer Hayat 如果文件名是def.hij.klm 怎么办?那么你的代码将如何工作? (您的代码仅适用于这个示例 - 您不妨编写一个返回 "abc" 的函数 - 它也同样适用)
          • @Bohemian:我知道有边界情况和检查缺失。这是对特定问题的特定答案,想法是通过示例给出总体思路:)。
          • @TofuBeer:好的,好吧,之前有一个混淆“(即一个点)”在实际帖子中不存在。我认为并希望我的回答能提供一个解决此类问题的总体思路。
          • 我会选择:int ix = inString.indexOf('.'); if (ix > -1) inString = inString.substring(0, ix);我不知道为什么Umer建议减1。substring的第二个参数是最多但不包括在内。
          【解决方案6】:

          使用正则表达式怎么样?

          String firstWord = filename.replaceAll("\\..*","")
          

          这会用“”替换从第一个点到结尾的所有内容(即清除它,留下你想要的)

          这是一个测试:

          System.out.println("abc.def.hij".replaceAll("\\..*", "");
          

          输出:

          abc
          

          【讨论】:

            【解决方案7】:

            在 java.lang.String 中,您会获得一些方法,例如 indexOf(): 它会返回字符/字符串的第一个索引。 和 lstIndexOf: 返回 String/char 的最后一个索引

            来自 Java 文档:

              public int indexOf(int ch)
              public int indexOf(String str)
            

            返回此字符串中第一次出现指定字符的索引。

            【讨论】:

              【解决方案8】:

              这里的代码从String返回一个子字符串,直到给定的字符列表中的任何一个:

              /**
               * Return a substring of the given original string until the first appearance
               * of any of the given characters.
               * <p>
               * e.g. Original "ab&cd-ef&gh"
               * 1. Separators {'&', '-'}
               * Result: "ab"
               * 2. Separators {'~', '-'}
               * Result: "ab&cd"
               * 3. Separators {'~', '='}
               * Result: "ab&cd-ef&gh"
               *
               * @param original   the original string
               * @param characters the separators until the substring to be considered
               * @return the substring or the original string of no separator exists
               */
              public static String substringFirstOf(String original, List<Character> characters) {
                  return characters.stream()
                          .map(original::indexOf)
                          .filter(min -> min > 0)
                          .reduce(Integer::min)
                          .map(position -> original.substring(0, position))
                          .orElse(original);
              }
              

              【讨论】:

                【解决方案9】:

                这可能会有所帮助:

                public static String getCorporateID(String fileName) {
                
                    String corporateId = null;
                
                    try {
                        corporateId = fileName.substring(0, fileName.indexOf("_"));
                        // System.out.println(new Date() + ": " + "Corporate:
                        // "+corporateId);
                        return corporateId;
                    } catch (Exception e) {
                        corporateId = null;
                        e.printStackTrace();
                    }
                
                    return corporateId;
                }
                

                【讨论】:

                  【解决方案10】:
                  public void getStrings() {
                      String params = "abc.def.ghi";
                      String s1, s2, s3;
                      s1 = params.substring(0, params.indexOf("."));
                      params = params.substring(params.indexOf(".") + 1);
                      s2 = params.substring(0, params.indexOf("."));
                      params = params.substring(params.indexOf(".") + 1, params.length());
                      s3 = params;
                  }
                  

                  解决方案

                  s1="abc" s2="定义" s3="ghi"

                  如果您有 超过 3 个 String ,那么它看起来 与 s2 完全一样

                  【讨论】:

                    【解决方案11】:
                      private String getTextBefore(final String wholeString, String before){
                       final int indexOf = wholeString.indexOf(before); 
                       if(indexOf != -1){
                           return wholeString.substring(0, indexOf);
                       }
                       return wholeString;
                    }
                    

                    【讨论】:

                      【解决方案12】:

                      我试过这样的,

                      String str = "abc.def.ghi";
                      String strBeforeFirstDot = str.substring(0, str.indexOf('.'));
                      // strBeforeFirstDot = "abc"
                      

                      我尝试在我的示例中提取@登录电子邮件之前的所有字符以提取并提供用户名。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2013-06-27
                        • 2017-10-16
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-05-25
                        • 1970-01-01
                        相关资源
                        最近更新 更多