Java には、たとえば などの文字列を取り、それを に分割するsplitByCharacterTypeメソッドがあります。C# にこのような組み込み関数はありますか? そうでない場合、これを行う関数をどのように構築しますか?0015j8*(
"0015","j","8","*","("
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
そのような方法は存在しないと思います。以下の手順に従って、独自のユーティリティ メソッドを作成できます。
- 分割された文字列を保持するリストを作成する
すべての文字タイプで文字列を定義します。
string numberString = "0123456789"; string specialChars = "~!@#$%^&*(){}|\/?"; string alphaChars = "abcde....XYZ";
- 一時文字列を保持する変数を定義します
- 文字のタイプを記録する変数を定義します
- 一度に 1 文字ずつ文字列をトラバースし、事前定義された型文字列内の文字の存在を確認して、文字の型を確認します。
- タイプが以前のタイプよりも新しい場合 (タイプ変数の値を確認)、一時文字列 (空ではない) をリストに追加し、新しいタイプをタイプ変数に割り当て、現在の文字を一時文字列に割り当てます。そうでない場合は、char を一時文字列に追加します。
- トラバーサルの最後に、一時的な文字列 (空ではない) をリストに追加します
- リストに分割された文字列が含まれるようになりました。
- リストを文字列配列に変換すれば完了です。
于 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 に答える