[解決済み】大文字の前にスペースを追加する
2022-04-10 04:25:16
質問
ThisStringHasNoSpacesButItDoesHaveCapitals"という文字列がある場合、大文字の前にスペースを追加する最も良い方法は何ですか?つまり、最後の文字列は "This String Has No Spaces But It Does Have Capitals".となります。
以下は、RegExを使った私の試みです。
System.Text.RegularExpressions.Regex.Replace(value, "[A-Z]", " $0")
解決方法は?
正規表現はうまくいきますが(私はMartin Brownsの回答に投票しました)、高価です(そして個人的には、数文字より長いパターンは法外に鈍重だと思います)。
この関数
string AddSpacesToSentence(string text, bool preserveAcronyms)
{
if (string.IsNullOrWhiteSpace(text))
return string.Empty;
StringBuilder newText = new StringBuilder(text.Length * 2);
newText.Append(text[0]);
for (int i = 1; i < text.Length; i++)
{
if (char.IsUpper(text[i]))
if ((text[i - 1] != ' ' && !char.IsUpper(text[i - 1])) ||
(preserveAcronyms && char.IsUpper(text[i - 1]) &&
i < text.Length - 1 && !char.IsUpper(text[i + 1])))
newText.Append(' ');
newText.Append(text[i]);
}
return newText.ToString();
}
100,000回を2,968,750ティックで実行し、正規表現は25,000,000ティックかかります(これは正規表現をコンパイルした場合です)。
しかし、メンテナンスのためのコードが多くなります。
お役に立てれば幸いです :)
更新情報
久しぶりに見たら、コードが変わってからタイミングが更新されていないことに今気づきました(少ししか変わっていない)。
Abbbbbbb'が100回繰り返される文字列(つまり1,000バイト)の場合、10万回の変換を実行するとハンドコード関数は4,517,177ティック、下のRegexは59,435,719で、ハンドコード関数はRegexにかかる時間の7.6%で実行できることになります。
アップデート2 頭字語は考慮されるのでしょうか?対応します if文のロジックはかなり曖昧ですが、これを展開するとこんな感じになります。
if (char.IsUpper(text[i]))
if (char.IsUpper(text[i - 1]))
if (preserveAcronyms && i < text.Length - 1 && !char.IsUpper(text[i + 1]))
newText.Append(' ');
else ;
else if (text[i - 1] != ' ')
newText.Append(' ');
...は全く役に立ちません!
以下は、オリジナルの シンプル メソッドは、頭文字を気にすることなく使用できます。
string AddSpacesToSentence(string text)
{
if (string.IsNullOrWhiteSpace(text))
return "";
StringBuilder newText = new StringBuilder(text.Length * 2);
newText.Append(text[0]);
for (int i = 1; i < text.Length; i++)
{
if (char.IsUpper(text[i]) && text[i - 1] != ' ')
newText.Append(' ');
newText.Append(text[i]);
}
return newText.ToString();
}
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み] 正規表現で変数を使うには?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] XHTMLの自己完結型タグを除くオープンタグにマッチするRegEx
-
[解決済み] 複数行の長い文字列を作成するためのPythonicな方法
-
[解決済み] JavaScriptの正規表現でマッチしたグループにアクセスするにはどうすればよいですか?
-
[解決済み] 正規表現を使用した電話番号の検証方法
-
[解決済み] JSで文字列が正規表現にマッチするかどうかをチェックする
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み】C#で文字列をenumに変換する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み] 関数を終了するには?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015