TextBox
..の小文字を削除しようとしています。
たとえば、保険を表す短いアルファ コード (例: 'Blue Cross Blue Shield' の 'BCBS'):
txtDesc.text = "Blue Cross Blue Shield";
string Code = //This must be BCBS..
出来ますか?私を助けてください。ありがとう!
正規表現を使用して、大文字の AZ 以外をすべて削除できます。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main( string[] args )
{
string input = "Blue Cross Blue Shield 12356";
Regex regex = new Regex("[^A-Z]");
string output = regex.Replace(input, "");
Console.WriteLine(output);
}
}
これにより、ASCII 以外の文字も削除されることに注意してください。別の正規表現は次のようになります。
Regex regex = new Regex(@"[^\p{Lu}]");
... すべての文化の大文字をカバーするべきだと思います。
string Code = new String(txtDesc.text.Where(c => IsUpper(c)).ToArray());
ここに私の変種があります:
var input = "Blue Cross Blue Shield 12356";
var sb = new StringBuilder();
foreach (var ch in input) {
if (char.IsUpper(ch)) { // only keep uppercase
sb.Append(ch);
}
}
sb.ToString(); // "BCBS"
私は通常、正規表現を使用するのが好きですが、「大文字のみ」を選択する方法がわかりません。[A-Z]
これがないと、英語のアルファベット以外の文字 (他のラテン文字でも! :-/) でひどく壊れます。
ハッピーコーディング。
しかし、正規表現の方法についてはスキート氏の回答を参照してください;-)
string Code = Regex.Replace(txtDesc.text, "[a-z]", "");
「小文字をスターに置き換える」実装を使用してみることができますが、「*」を「」(空白) に変更してください。
したがって、コードは次のようになります。
txtDesc.Text = "Blue Cross Blue Shield";
string TargetString = txt.Desc.Text;
string MainString = TargetString;
for (int i = 0; i < TargetString.Length; i++)
{
if (char.IsLower(TargetString[i]))
{
TargetString = TargetString.Replace( TargetString[ i ].ToString(), string.Empty );
}
}
Console.WriteLine("The string {0} has converted to {1}", MainString, TargetString);
次のような辞書で、値を略語にマップします。
Dictionary<string, string> valueMap = new Dictionary<string, string>();
valueMap.Add("Blue Cross Blue Shield", "BCBS");
string Code = "";
if(valueMap.ContainsKey(txtDesc.Text))
Code = valueMap[txtDesc.Text];
else
// Handle
ただし、言及した機能がまだ必要な場合は、linq を使用します。
string newString = new string(txtDesc.Text.Where(c => char.IsUpper(c).ToArray());
正規表現なし:
string input = "Blue Cross Blue Shield";
string output = new string(input.Where(Char.IsUpper).ToArray());
Response.Write(output);
string caps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string.Join("",
"Blue Cross Blue Shield".Select(c => caps.IndexOf(c) > -1 ? c.ToString() : "")
.ToArray());
すべて大文字で一致させるのではなく、すべての単語の最初の文字を一致させる必要があると思います。これにより、一貫性のない入力が可能になりますが、長期的には信頼性が高くなります。このため、次のコードを使用することをお勧めします。Match
オブジェクトのそれぞれに集計を使用しRegex
、値を という文字列オブジェクトに追加しますoutput
。
string input = "Blue Cross BLUE shield 12356";
Regex regex = new Regex("\\b\\w");
string output = regex.Matches(input).Cast<Match>().Aggregate("", (current, match) => current + match.Value);
Console.WriteLine(output.ToUpper()); // outputs BCBS1
これは完璧ではありませんが、動作するはずです (そして BCBS テストに合格します):
private static string AlphaCode(String Input)
{
List<String> capLetter = new List<String>();
foreach (Char c in Input)
{
if (char.IsLetter(c))
{
String letter = c.ToString();
if (letter == letter.ToUpper()) { capLetter.Add(letter); }
}
}
return String.Join(String.Empty, capLetter.ToArray());
}
そして、このバージョンは奇妙な入力シナリオを処理します (これにより、各単語の最初の文字が大文字になります)。
private static string AlphaCode(String Input)
{
String capCase = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Input.ToString().ToLower());
List<String> capLetter = new List<String>();
foreach (Char c in capCase)
{
if (char.IsLetter(c))
{
String letter = c.ToString();
if (letter == letter.ToUpper()) { capLetter.Add(letter); }
}
}
return String.Join(String.Empty, capLetter.ToArray());
}
string Code = Regex.Replace(txtDesc.text, "[a-z]", "");