从字符串中提取子字符串


Answers:


135

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

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 2014年

只需先测试返回值。类似于:if(str.indexOf(“ char”)> 0)
Chuck Claunch 2014年

很好的答案,但子字符串必须全部为小写。所以它是substring()而不是subString()
CodyMace 2015年

Android文档是一个更好的来源:字符串子字符串(int beginIndex,int endIndex)返回一个字符串,该字符串是该字符串的子字符串。子字符串从指定的beginIndex开始,并扩展到索引endIndex-1处的字符。因此,子字符串的长度为endIndex-beginIndex。
马丁


26

这是一个真实的例子:

String hallostring = "hallo";
String asubstring = hallostring.substring(0, 1); 

在示例中,子字符串将返回:h


3
该答案隐式地添加了其他两个更普遍的答案所缺少的信息,即字符串是0,而不是基于1的字符串,并且应该获得比这样做更多的爱。
LDMJoe

2
重要的不是基础。子字符串采用部分字符串,从位置startIndex开始,一直扩展到但不包括endIndex。
马丁

基础不重要???要知道索引从零到string.length(),并且返回的最后一个字符是由endIndex-1索引的那个字符,这真是令人难以置信的重要,您不是要说吗?
kbro19年


12

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当startIndex = endIndex时,它返回一个空字符串。
sHOLE,

3

使用来自android的文本未读类:
TextUtils.substring (charsequence source, int start, int end)


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;
马丁

3

您可以使用此代码

    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是一个超级lastString字符串,例如“ I_AmANDROID.Devloper”,是一个类似“”的字符串。” 并且startString就像“ _”。因此,这function将返回“ AmANDROID”。享受您的编码时间。:)


1

当发现匹配模式的子字符串的多次出现

    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
    }

0

在Android中获取子字符串的最佳方法是使用(如@ user2503849所述)TextUtlis.substring(CharSequence, int, int)方法。我可以解释为什么。如果你看一看在String.substring(int, int)从法android.jar(最新API 22),您将看到:

public String substring(int start) {
    if (start == 0) {
        return this;
    }
    if (start >= 0 && start <= count) {
        return new String(offset + start, count - start, value);
    }
    throw indexAndLength(start);
}

好的,然后...您如何看待私有构造函数的String(int, int, char[])外观?

String(int offset, int charCount, char[] chars) {
    this.value = chars;
    this.offset = offset;
    this.count = charCount;
}

如我们所见,它一直引用“旧”值char[]数组。因此,GC无法释放它。

在最新的Java中,它已修复:

String(int offset, int charCount, char[] chars) {
    this.value = Arrays.copyOfRange(chars, offset, offset + charCount);
    this.offset = offset;
    this.count = charCount;
}

Arrays.copyOfRange(...) 在内部使用本机数组复制。

而已 :)

最好的祝福!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.