1

我有以下字符串数组(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 中达到相同的结果?理想情况下,我正在寻找单行答案。如果不可能,那么最短的就可以了。

4

3 回答 3

2

没有有效的单行答案,因为indexOfAnyjava.lang.StringAPI 中没有直接的等价物。

这是几行有效的等价物。

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

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

于 2011-03-26T00:04:58.067 回答
2

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

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

于 2011-03-26T01:45:58.797 回答
1

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

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

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

如果您需要扩展代码以捕获其他分隔符,例如可能.,您只需使用另一个运算符将分隔符添加到组中|

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

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

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 和Matcher.group来挑选特定数字即可。

相关链接

字符串文档

模式文档

匹配器文档

Java中的正则表达式

正则表达式维基百科

于 2011-03-26T00:02:03.127 回答