在Java中从字符串中删除尾部子字符串

9

我想删除字符串的某些部分,如果它以特定字符串结尾。

例如,将使用此字符串:"am.sunrise.ios@2x.png"

然后删除@2x.png,使其看起来像:"am.sunrise.ios"

如何检查字符串的结尾是否包含"@2x.png"并将其删除?


2
请查看String类中的substringendsWith方法。 - Reimeus
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - jlordo
你想要替换所有的 @2x.png 还是任何以 @ 开头直到结尾的子字符串? - Pshemo
8个回答

12

可以使用lastIndexOf查找字符串中指定字符的位置,然后使用substring将其删除:

String str = "am.sunrise.ios@2x.png";
String search = "@2x.png";

int index = str.lastIndexOf(search);
if (index > 0) {
    str = str.substring(0, index);
}

7
String.lastIndexOf 方法可以在字符串中找到子串,不仅仅是在结尾处。你应该使用 str.endsWith(suffix) 进行检查,然后内联调用 lastIndexOf - jirassimok

9
假设您有一个字符串初始化为String file = "am.sunrise.ios@2x.png";
if(file.endsWith("@2x.png"))
    file = file.substring(0, file.lastIndexOf("@2x.png"));

endsWith(String) 方法返回一个布尔值,用于确定字符串是否有特定的后缀。根据此结果,您可以使用自身子字符串替换从第一个字符开始到要删除的字符索引之前结束的字符串。


索引不能为-1,因为字符串已经被检查以结束于"@2x.png"。 - user3377716
lastIndexOf 更正确,因为我们只需要删除指定字符串的结尾部分。 indexOf 返回指定字符串的第一个匹配项,但在这种情况下,我们需要该指定字符串的最后一个匹配项.endsWith("@2x.png") 确保了 lastIndexOf 具体指的是 @2x.png。@Pshemo - Sam S

7
private static String removeSuffixIfExists(String key, String suffix) {
    return key.endswith(suffix)
        ? key.substring(0, key.length() - suffix.length())
        : key; 
    }
}

String suffix = "@2x.png";
String key = "am.sunrise.ios@2x.png";

String output = removeSuffixIfExists(key, suffix);


依我之见,这应该是被接受的答案。它是最高效的解决方案:后缀只匹配一次,与其他基于endsWith()+lastIndexOf()的解决方案相反。 - Padrig
此外,目前被接受的解决方案可能删除的不仅仅是后缀... - Padrig

1
如果您想要从字符串中的 @ 到结尾删除整个内容,您可以使用以下方法:
yourString = yourString.replaceAll("@.*","");

其中@.*是正则表达式(正则表达式),表示以@开头并在其后具有任何字符(由.表示)零次或多次(由*表示)的子字符串。

如果没有@xxx部分,您的字符串将保持不变。


如果您只想更改特定的子字符串@2x.png(而不是像@3x.png这样的子字符串),同时确保它位于字符串末尾,您可以使用。
yourString = yourString.replaceAll("@2x\\.png$","");

什么是

  • $ 代表字符串的结尾
  • \\. 代表 . 的字面意思(我们需要转义它,因为像之前展示的一样,. 是一个元字符,表示任何字符)

1
public static void main(String [] args){

    String word = "am.sunrise.ios@2x.png";

    word = word.replace("@2x.png", "");

    System.out.println(word);
}

这不会从末尾删除该字符串。例如,该字符串可能是"@2x.png@2x.png",结果应该是"@2x.png"而不是空字符串,因为这会影响提问者的目标。 - user3377716
我不确定我理解你的意思。我刚刚重新运行了代码,输出结果是......"am.sunrise.ios"。我在这方面经验不太丰富,如果我遗漏了什么,请帮助我理解。 - Christopher Bell
你的解决方案从字符串中移除了 "@2x.png"。然而,它没有检查它是否在字符串的结尾,因为无论它是否在字符串的开头,它都会被移除。 - user3377716

1

由于我试图在一个类似的样式的项目ArrayList上执行此操作,因此最终使用了以下代码:

    for (int image = 0; image < IBImages.size(); image++) {
        IBImages.set(image, IBImages.get(image).split("~")[0].split("@")[0].split(".png")[0]);
    }

如果我有一组带有名称的图片列表

[am.sunrise.ios.png, am.sunrise.ios@2x.png, am.sunrise.ios@3x.png, am.sunrise.ios~ipad.png, am.sunrise.ios~ipad@2x.png]

这使我能够将字符串分成两部分。例如,如果我在“~”处分割,“am.sunrise.ios〜ipad.png”将被分成“am.sunrise.ios”和“〜ipad.png”。通过引用[0],我可以仅获取第一部分。因此,我只需一行代码即可获得我要查找的内容。
请注意,image是“am.sunrise.ios〜ipad.png”。

0
你可以使用 String.split() 方法:
public static void main(String [] args){
  String word = "am.sunrise.ios@2x.png";
  String[] parts = word.split("@");
  if (parts.length == 2) {
    System.out.println("looks like user@host...");
    System.out.println("User: " + parts[0]);
    System.out.println("Host: " + parts[1]);
  }
}

然后你有一个字符串数组,其中第一个元素包含“@”之前的部分,第二个元素包含“@”之后的部分。


-1

结合答案12

String str = "am.sunrise.ios@2x.png";
String search = "@2x.png";

if (str.endsWith(search)) {
  str = str.substring(0, str.lastIndexOf(search));
}

这会浪费性能,因为要对字符串进行两次搜索。 - tkruse

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