从字符串中提取子串

79

最佳方法是什么,可以从Android字符串中提取子字符串?

11个回答

143

如果您知道开始和结束索引,您可以使用

String substr=mysourcestring.substring(startIndex,endIndex);

如果您想从特定索引开始获取子字符串直到末尾,可以使用:

String substr=mysourcestring.substring(startIndex);

如果您想从特定字符获取子字符串直到末尾,可以使用:

String substr=mysourcestring.substring(mysourcestring.indexOf("characterValue"));

如果你想要获取某个特定字符后面的子字符串,那么将该字符的索引加上需要的长度即可使用 .indexOf(char) 方法:

String substr=mysourcestring.substring(mysourcestring.indexOf("characterValue") + 1);

假设我想要获取字符串中某个字符的索引,我可以使用 .indexof("char")。但在我的情况下,有时该字符可能不在字符串中。那么我想要得到一个空字符串。如何处理这个错误? - Abhinav Raja
先测试返回值。类似这样: 如果(str.indexOf("char") > 0) - Chuck Claunch
很好的回答,但是子字符串需要全部小写。所以应该使用substring()而不是subString()。 - CodyMace
Android文档是更好的来源: String substring (int beginIndex, int endIndex) 返回一个字符串,该字符串是此字符串的子字符串。子字符串从指定的beginIndex开始,并延伸到索引endIndex-1处的字符。因此,子字符串的长度为endIndex-beginIndex。 - Martin

81

2
简单而完美 - Shujat Munawar

32

以下是一个现实世界的例子:

String hallostring = "hallo";
String asubstring = hallostring.substring(0, 1); 
在这个例子中,asubstring将返回:h

6
这个回答隐含地补充了其他两个更受欢迎的答案中缺失的信息,即该字符串是以0为基础而非1,并因此值得更多的赞誉。 - LDMJoe
2
重要的不是基础。substring 函数从 startIndex 位置开始获取部分字符串,一直延伸到但不包括 endIndex 位置。 - Martin
2
基础不重要吗???了解索引从零到字符串.length(),以及最后一个返回的字符是由endIndex - 1索引的,这不是非常重要吗? - kbro
这仍然是最好的答案,因为它展示了beginIndex是基于0的,而endIndex是基于1的。因为尽管听起来很奇怪,但这就是这个函数的工作方式。 - ATL

17

如果您想要获取一个字符前后的子字符串,还有另一种方法。

String s ="123dance456";
String[] split = s.split("dance");
String firstSubString = split[0];
String secondSubString = split[1];

请查看此帖子 - 如何在字符串中找到前后子字符串


14

substring(int startIndex, int endIndex)

如果不指定endIndex,此方法将返回从startIndex开始的所有字符。

startIndex:起始索引包含在内。

endIndex:结束索引不包含。

示例:

String str = "abcdefgh"

str.substring(0, 4) => abcd

str.substring(4, 6) => ef

str.substring(6) => gh


1
定义 (0, 4) 导致 abcd,这是最佳答案!将 (0,0) 或 (1,1) 显示结果 "a" 吗? - Bay
@Bay 当 startIndex = endIndex 时,它返回一个空字符串。 - sHOLE

5
你可以使用这段代码。
    public static String getSubString(String mainString, String lastString, String startString) {
    String endString = "";
    int endIndex = mainString.indexOf(lastString);
    int startIndex = mainString.indexOf(startString);
    Log.d("message", "" + mainString.substring(startIndex, endIndex));
    endString = mainString.substring(startIndex, endIndex);
    return endString;
}

在这个例子中,mainString 是一个超级字符串,格式为 "I_AmANDROID.Devloper",而lastString是一个以"."结尾的字符串,startString是一个以"_"开头的字符串。因此,这个function返回"AmANDROID"。祝你编码愉快。 :)

3
您可以使用subSequence,它与C语言中的substr相同。
 Str.subSequence(int Start , int End)

在C++中,substr的定义是使用START和LENGTH而不是startIndex和endIndex:string substr(size_t pos = 0, size_t len = npos) const; - Martin

3

使用Android中未公开的文本类:
TextUtils.substring (CharSequence source, int start, int end)


2
当查找多个与模式匹配的子字符串时,可以使用“re.findall()”函数。这个函数返回一个列表,其中包含所有匹配的子字符串。
    String input_string = "foo/adsfasdf/adf/bar/erqwer/";
    String regex = "(foo/|bar/)"; // Matches 'foo/' and 'bar/'

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input_string);

    while(matcher.find()) {
      String str_matched = input_string.substring(matcher.start(), matcher.end());
        // Do something with a match found
    }

1

所有回答者都给出了很好的答案。然而,我会为大家提供相关的方法,以便任何人都可以从一个地方获取,如果我发现新的内容,我会编辑我的答案。

  1. substring(0) - 用于从给定的特定字符中截取字符串。

  2. Substring(0,2) - 给出从起始位置(0)和结束位置(2)提取的子字符串。

  3. Split("NAME") - 返回两部分字符串,第一部分是您在拆分“NAME”时使用的字符串,另一部分是剩余的字符串组合。

  4. subSequence(0,3) - 返回给定起始索引(0)和结束索引(3)之间的序列。

    虽然这个方法不是专门用于拆分字符串,但对于某些人来说可能会很有用。

  5. startswith("A",3) - 返回特定起始字符的字符串。

    例如:

    String s = "StackOverflow";
    String[] split = s.split("Stack");
    
    System.out.println("STRING NAME:"+s.substring(2));
    System.out.println("STRING NAME:"+s.substring(2,3));
    System.out.println("STRING NAME:"+split[1]);
    System.out.println("STRING NAME:"+split[0]);
    System.out.println("STRING NAME:"+s.subSequence(2,5));
    

    输出结果:

     1)ackOverflow
     2)a
     3)Overflow
     4)stack
     5)ack
    

我希望这能够为您提供所需的足够信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接