1

Java には、たとえば などの文字列を取り、それを に分割するsplitByCharacterTypeメソッドがあります。C# にこのような組み込み関数はありますか? そうでない場合、これを行う関数をどのように構築しますか?0015j8*("0015","j","8","*","("

4

3 に答える 3

3
public static IEnumerable<string> SplitByCharacterType(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentNullException(nameof(input));

    StringBuilder segment = new StringBuilder();
    segment.Append(input[0]);
    var current = Char.GetUnicodeCategory(input[0]);

    for (int i = 1; i < input.Length; i++)
    {
        var next = Char.GetUnicodeCategory(input[i]);
        if (next == current)
        {
            segment.Append(input[i]);
        }
        else
        {
            yield return segment.ToString();
            segment.Clear();
            segment.Append(input[i]);
            current = next;
        }
    }
    yield return segment.ToString();
}

使用方法は次のとおりです。

string[] split = SplitByCharacterType("0015j8*(").ToArray();

そして結果は"0015","j","8","*","("

拡張メソッドとして実装することをお勧めします。

于 2012-11-25T04:10:54.990 に答える
2

そのような方法は存在しないと思います。以下の手順に従って、独自のユーティリティ メソッドを作成できます。

  1. 分割された文字列を保持するリストを作成する
  2. すべての文字タイプで文字列を定義します。

     string numberString = "0123456789";
     string specialChars = "~!@#$%^&*(){}|\/?";
     string alphaChars = "abcde....XYZ";
    
  3. 一時文字列を保持する変数を定義します
  4. 文字のタイプを記録する変数を定義します
  5. 一度に 1 文字ずつ文字列をトラバースし、事前定義された型文字列内の文字の存在を確認して、文字の型を確認します。
  6. タイプが以前のタイプよりも新しい場合 (タイプ変数の値を確認)、一時文字列 (空ではない) をリストに追加し、新しいタイプをタイプ変数に割り当て、現在の文字を一時文字列に割り当てます。そうでない場合は、char を一時文字列に追加します。
  7. トラバーサルの最後に、一時的な文字列 (空ではない) をリストに追加します
  8. リストに分割された文字列が含まれるようになりました。
  9. リストを文字列配列に変換すれば完了です。
于 2012-11-25T04:00:28.647 に答える
0

以下のような正規表現クラスを使用することもできますが、数字と文字以外の文字のサポートを追加する必要があります。

   var chars = Regex.Matches("0015j8*(", @"((?:""[^""\\]*(?:\\.[^""\\]*)*"")|[a-z]|\d+)").Cast<Match>().Select(match => match.Value).ToArray(); 

結果 0015,J,8

于 2012-11-25T04:08:17.987 に答える