删除某个字符后的所有内容(IndexOfAny和Remove)

时间:2011-03-25 23:45:07

标签: c# java string indexof

我有以下字符串数组(quantityInForPriceBandPopUp [3])数据:

10 - 24
25 - 99
100 - 249 
5000+

在C#中,如果我把这个数组放在这个:

quantityInForPriceBandPopUp[i] = quantityInForPriceBandPopUp[i].Remove(quantityInForPriceBandPopUp[i].IndexOfAny(new char[] { ' ', '+' }));

我明白了:

10
25
100
5000

如何在Java中获得相同的结果?理想情况下,我正在寻找一个答案。如果不可能,那么最短的就行了。

3 个答案:

答案 0 :(得分:2)

没有有效的单行答案,因为indexOfAny API中没有与java.lang.String直接等效的内容。

这是几行中有效的等价物。

int pos = Math.min(Math.max(s.indexOf(' '), -1), Math.max(s.indexOf('+'), -1));
if (pos != -1) {
    s = s.substring(0, pos);
}

您可以轻松将其转换为静态辅助方法。

答案 1 :(得分:2)

看一看 http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/StringUtils.html

它有indexOfAny方法和更多字符串方法

答案 2 :(得分:1)

也许不是最有效的,但你可以使用正则表达式和replaceFirst

for (int i = 0; i < arr.length; i++)
{
  arr[i] = arr[i].replaceFirst("( |\\+).*$","");
}

基本上,它会找到空格' '或加号+的第一个实例,我们必须使用两个\转义,因为+也是一个特殊的正则表达式中的符号,以及跟在.*之后的任何其他字符,直到结束$,并用空字符串替换它。

如果您需要扩展代码以捕获其他分隔符,例如.,则只需将分隔符添加到具有另一个|运算符的组中:

  arr[i] = arr[i].replaceFirst("( |\\+|\\.).*$","");

现在,这将编译一个新的正则表达式Pattern每个循环,如果您的数组中有很多字符串,这绝对不是理想的。在这种情况下,您可能会考虑首先在循环外编译单独的模式:

Pattern pattern = Pattern.compile("( |\\+).*$");
for (int i = 0; i < arr.length; i++)
{
  arr[i] = pattern.matcher(arr[i]).replaceFirst("");
}

如果你想要之后的部分,像这样的正则表达式会:

for (int i = 0; i < arr.length; i++)
{
  arr[i] = arr[i].replaceFirst("^.*( |\\+)\\s*","");
}

注意,如果您仍想为“5000 +”捕获“5000”,则需要修改此项。

制作一个单独的通用正则表达式使用“\ d +”来定位数字可能是值得的,例如:

^(\\d+).*((\\d+)?)$

然后,只需使用匹配器和Matcher.group来挑选特定数字。

相关链接

String documentation

Pattern documentation

Matcher documentation

Regular Expressions in Java

Wikipedia on Regular Expressions