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で同じ結果を得るにはどうすればよいですか? 理想的には、1行の答えを探しています。それが不可能な場合は、最短でうまくいきます。

4

3 に答える 3

2

http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/StringUtils.htmlを ご覧ください。

indexOfAny メソッドとさらに多くの文字列メソッドがあります

于 2011-03-26T01:45:58.797 に答える
2

APIにindexOfAnyは に直接相当するものがないため、効率的な 1 行の回答はありません。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);
}

そして、それを簡単に静的ヘルパー メソッドに変えることができます。

于 2011-03-26T00:04:58.067 に答える
1

最も効率的ではないかもしれませんが、正規表現とreplaceFirstを使用できます

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

' '基本的に、スペースまたはプラス記号の最初のインスタンスを見つけます。これは、正規表現の特殊記号でもあるため+、2 でエスケープする必要があり、最後まで続く他の文字と一緒に、空に置き換えます。ストリング。\+.*$

Maybe のように他の区切り文字をキャッチするためにコードを拡張する必要がある場合は、別の演算子.を使用してグループに区切り文字を追加するだけです。|

  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 に答える