lastIndexOf()函数用于查找最后一个字母数字字符。

6

我有一个字符串,需要找到该字符串中任何字母数字字符的最后一次出现。无论该字符串中最后一个字母数字字符是什么,我都想要它的索引。

text="Hello World!- "

输出将是'd'的索引。
text="Hello02, "

输出将是'2'的索引。 我知道可以通过“暴力”方式实现,检查每个字母和每个数字并找到最高索引,但我相信有更简洁的方法,但我找不到它。

4
从字符串末尾开始遍历,直到找到第一个(也就是最后一个)数字或字母。 - Njol
那会有什么帮助呢?我不明白的是,我应该在 .lastIndexOf() [或 .indexOf()] 中写什么才能使它只打印字母数字字符的索引。我该如何让它查找字母或数字,而不是特殊字符? - Iverie
发布了一个带有示例实现的答案。 - Njol
@Iverie,lastIndexOf 只能搜索特定的固定字符串,无法搜索正则表达式模式。您需要采用 Njol 回答中的方法。 - ADTC
或者说,Bohemian的答案会给你一个一行代码的解决方案! - ADTC
3个回答

13

这将按预期工作,甚至可以在几乎所有Unicode字符和数字上工作:

public static final int lastAlphaNumeric(String s) {
    for (int i = s.length() - 1; i >= 0; i--) {
        char c = s.charAt(i);
        if (Character.isLetter(c) || Character.isDigit(c))
            return i;
    }
    return -1; // no alphanumeric character at all
}

它也比其他答案快得多 ;)


4
@Iverie,请接受答案(左侧的绿色勾号)。这不仅会给我们带来一些积分,还会使问题从未回答的问题列表中消失。 - Njol

3

使用正则表达式来处理复杂任务。

要获取最后一个字母数字字符的索引(如果字符串中没有字母数字,则为-1):

int index = str.replaceAll("[^a-zA-Z0-9]*$", "").length() - 1;

要获取字符本身:
String last = str.replaceAll("[^a-zA-Z0-9]*$", "").replaceAll(".(?!$)", "");

如果开头或中间有非字母数字字符,那么你的索引逻辑就会出错。 - ADTC
@ADTC 你误解了。这个逻辑无论字符串是什么都能完美运行。例如,使用 "foo,bar," 进行测试会得到 6(这是正确的)。而且,即使没有字母数字字符,它仍然可以工作——索引将为 -1。(已经修复了 int,但还是谢谢) - Bohemian

-1
将字符串转换为字符数组并获取该数组的长度将为您提供任何字符串的最后一个索引...

OP 想获取最后一个字母数字字符的索引。 - ADTC
1
这相当于string.length(),但中间有一个无用的数组分配。它也不是最后一个字符的索引,而是最后一个字符之后的索引。 - Njol

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