Как убрать строчные буквы в текстовом поле? - PullRequest
17 голосов
/ 23 мая 2011

Я пытаюсь удалить строчные буквы на TextBox ..

Например, короткий альфа-код, представляющий страховку (например, «BCBS» для «Blue Cross Blue Shield»):

txtDesc.text = "Blue Cross Blue Shield";

string Code = //This must be BCBS.. 

Возможно ли это? Пожалуйста, помогите мне. Спасибо!

Ответы [ 11 ]

38 голосов
/ 23 мая 2011

Ну, вы можете использовать регулярное выражение для удаления всего, что не было прописной буквой 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}]");

... Я считаю, что это должно охватывать заглавные буквы всех культур.

20 голосов
/ 23 мая 2011
string Code = new String(txtDesc.text.Where(c => IsUpper(c)).ToArray());
12 голосов
/ 23 мая 2011

Вот мой вариант:

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], что плохо отразится на символахза пределами английского алфавита (даже других латинских символов!: - /)

Удачного кодирования.


Но см. ответ мистера Скита о способе регулярных выражений; -)

7 голосов
/ 23 мая 2011
string Code = Regex.Replace(txtDesc.text, "[a-z]", "");
7 голосов
/ 23 мая 2011

Я бы сопоставил значение с вашей аббревиатурой в словаре, например:

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());
7 голосов
/ 23 мая 2011

Вы можете попробовать использовать ' Заменить строчные буквы на звездочку ', но замените '*' на '' (пусто)

Таким образом, код будет выглядеть примерно так:

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);
6 голосов
/ 08 июня 2011

без регулярных выражений:

string input = "Blue Cross Blue Shield";
string output = new string(input.Where(Char.IsUpper).ToArray());
Response.Write(output);
5 голосов
/ 04 июня 2011
string caps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

string.Join("",
   "Blue Cross Blue Shield".Select(c => caps.IndexOf(c) > -1 ? c.ToString() : "")
                           .ToArray());
3 голосов
/ 09 июня 2011

Вместо того, чтобы сопоставлять все заглавные буквы, я думаю, что спецификация потребует сопоставления первого символа из всех слов.Это позволило бы вводить данные, не вызывая беспокойства, но при этом оставаться надежным в долгосрочной перспективеПо этой причине я предлагаю использовать следующий код.Он использует агрегат для каждого 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
.
2 голосов
/ 10 июня 2011

Это не идеально, но должно работать (и проходит ваш тест 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());
}
...