3

私はもう少し理解しようとしていstring operationsますregexes。たとえば、次の配列はString次のようになります。

String [] tab = {"__09_23_HELLO","__89_2_WORLD","900_23_TRY","_34_90_SATELLITE", 
"___23_", "390"};

ここでやりたいことは、アンダースコアとそれに続く文字の後にのみデータを保持し、見つからない場合は を返すことnullです。この例では、次のようになります。

HELLO WORLD TRY SATELLITE null null

だから私はこの再帰関数を書きました:

public String getName(String string, int i)
{
    if(i == string.length()-1) return null;
    if(string.charAt(i) != '_' || 
      (string.charAt(i) == '_' && !Character.isLetter(string.charAt(i+1)))) 
        return getName(string, i+1);
    else
        return string.substring(i+1);
}

そして、それはうまく機能します。しかし、私は多くの正規表現を知らないので(おそらく他の方法も?)、正規表現でそれができるかどうか、そして大量のデータでより速く処理できるかどうかを知りたいです。

回答ありがとうございます。

4

4 に答える 4

3

再帰関数を使用できますが、別のアプローチを使用する方が間違いなく高速です。

  • ループを使用します(アプローチに似ていますが、再帰の代わりにループを使用してカウンターを増やしますi)。

  • または、あなたが提案したように正規表現一致でそれを書いてください。

これら 2 つの可能性のうちどちらが速いかを判断するのは簡単ではありませんが、ループ コードが非常に賢く、可能な限り最小限でない限り、正規表現の方が速いと思います。2つのアプローチをコーディングしてベンチマークする方法がないことを確認するには...

于 2013-03-07T09:35:27.270 に答える
2

配列内の各要素に正規表現を適用します。

/[^_\d\s]+/g
于 2013-03-07T09:37:46.493 に答える
2

JIT has a hard time optimizing recursive calls (see this article), so I try to avoid it where possible. Here's a regex solution (in combination with substring, as you anticipated with your tag).

String [] tab = {"__09_23_HELLO","__89_2_WORLD","900_23_TRY","_34_90_SATELLITE",  "___23_", "390"};
Pattern pattern = Pattern.compile("_[a-zA-Z]");
for (int i = 0; i < tab.length; i++) {
    Matcher matcher = pattern.matcher(tab[i]);
    if (matcher.find()) {
        tab[i] = tab[i].substring(matcher.start() + 1);
    } else {
        tab[i] = null;
    }
}
System.out.println(Arrays.toString(tab));
于 2013-03-07T09:32:17.850 に答える
1

次の実装を作成しました (元の文字列配列から値を変換します)。

for (int index = 0; index < strings.length; index++) {
    String eachString = strings[index];
    int startIndex = eachString.lastIndexOf('_') + 1;
    if (startIndex > 0 && eachString.length() != startIndex && Character.isLetter(eachString.charAt(startIndex))) {
        strings[index] = eachString.substring(startIndex);
    } else {
        strings[index] = null;
    }
}
return strings;
于 2013-03-07T11:21:32.360 に答える