как разобрать строку для заглавных слов - PullRequest
0 голосов
/ 06 января 2009

У меня есть эта строка: " Mimi loves Toto and Tata hate Mimi so Toto killed Tata"

Я хочу написать код, который печатает только слова, начинающиеся с заглавных букв, избегая повторения

Вывод должен быть как

Mimi
Toto
Tata

Я пытался сделать это, но я уверен, что это неправильно, хотя никаких ошибок не отображается.

Код, который я написал:

static void Main(string[] args)
        {
            string s = "Memi ate Toto and she killed Tata Memi also hate Biso";
            Console.WriteLine((spliter(s)));
        }



        public static string spliter(string s)
        {

            string x = s;
            Regex exp = new Regex(@"[A-Z]");
            MatchCollection M = exp.Matches(s);

            foreach (Match t in M)
            {

                while (x != null)
                {
                    x = t.Value;  
                }

            }
            return x;
        }


    }
}

Идея:

Что, если я разделю строку на массив, затем применю регулярное выражение, чтобы проверить их слово за словом, а затем распечатать результаты? Я не знаю - может ли кто-нибудь помочь мне заставить этот код работать?

Ответы [ 12 ]

7 голосов
/ 06 января 2009

Я вообще не знаю C # /. Net regex lib, но этот шаблон регулярных выражений сделает это:

\b[A-Z][a-z]+

\ b означает, что совпадение может начаться только в начале слова. измените + на *, если хотите разрешить прописные буквы из одного слова.

Редактировать: Вы хотите соответствовать "Макдональдс"?

\b[A-Z][A-Za-z']+

Если вы не хотите сопоставлять ', если оно появляется только в конце строки, просто сделайте это:

\b[A-Z][A-Za-z']+(?<!')
6 голосов
/ 06 января 2009

Я не уверен, почему я публикую это ...

   string[] foo = "Mimi loves Toto and Tata hate Mimi so Toto killed Tata".Split(' ');
            HashSet<string> words = new HashSet<string>();
            foreach (string word in foo)
            {
                if (char.IsUpper(word[0]))
                {
                    words.Add(word);
                }
            }

            foreach (string word in words)
            {
                Console.WriteLine(word);
            }
5 голосов
/ 06 января 2009

C # 3

        string z = "Mimi loves Toto and Tata hate Mimi so Toto killed Tata";
        var wordsWithCapital = z.Split(' ').Where(word => char.IsUpper(word[0])).Distinct();
        MessageBox.Show( string.Join(", ", wordsWithCapital.ToArray()) );

C # 2

        Dictionary<string,int> distinctWords = new Dictionary<string,int>();
        string[] wordsWithInitCaps = z.Split(' ');
        foreach (string wordX in wordsWithInitCaps)
            if (char.IsUpper(wordX[0]))
                if (!distinctWords.ContainsKey(wordX))
                    distinctWords[wordX] = 1;
                else
                    ++distinctWords[wordX];                       


        foreach(string k in distinctWords.Keys)
            MessageBox.Show(k + ": " + distinctWords[k].ToString());
2 голосов
/ 06 января 2009

используйте это регулярное выражение

* ** 1003 тысяча два * ([A-Z] [A-Z] +)

Объяснение:

[A-Z]    [a-z]+
  |        |
Single   Multiple(+)
  |        |
  C      apital   -> Capital

Попробуйте регулярное выражение здесь

2 голосов
/ 06 января 2009

Я бы предложил сделать string.split для разделения строки на слова, а затем просто напечатать слова, где char.IsUpper (word [0]) имеет значение true.

Что-то вроде это

1 голос
/ 06 сентября 2011

Соответствующее регулярное выражение: \b\p{Lu}\p{L}*

var result = 
    Regex.Matches(input, @"\b\p{Lu}\p{L}*")
    .Cast<Match>().Select(m => m.Value);
1 голос
/ 06 января 2009

Так как другие уже опубликовали так много ответов, я не чувствую, что нарушаю правила домашней работы, чтобы показать это:

//set up the string to be searched
string source =
"First The The Quick Red fox jumped oveR A Red Lazy BRown DOg";

//new up a Regex object.
Regex myReg = new Regex(@"(\b[A-Z]\w*)");

//Get the matches, turn then into strings, de-dupe them
IEnumerable<string> results =
    myReg.Matches(source)
    .OfType<Match>()
    .Select(m => m.Value)
    .Distinct();

//print out the strings.
foreach (string s in results)
    Console.WriteLine(s);
  • Для изучения типа Regex, вы должны начать здесь .
  • Для изучения методов запросов Linq в памяти вы должны запустить здесь .
1 голос
/ 06 января 2009

Решение. Обратите внимание на использование встроенного разделителя строк. Вы можете заменить туфельку, проверив, находится ли первый символ между «A» и «Z». Удаление дубликатов, которые я оставляю вам (используйте хешсет, если хотите).

static void Main(string[] args)
    {
        string test = " Mimi loves Toto and Tata hate Mimi so Toto killed Tata";
        foreach (string j in test.Split(' '))
        {
            if (j.Length > 0)
            {
                if (j.ToUpper()[0] == j[0])
                {
                    Console.WriteLine(j);
                }
            }
        }
        Console.ReadKey(); //Press any key to continue;
    }
0 голосов
/ 06 сентября 2010
function capitalLetters() {
  var textAreaId = "textAreaId";
  var resultsArray = $(textAreaId).value.match( /\b[A-Z][A-Za-z']+/g );
  displayResults(textAreaId, resultsArray);
}
0 голосов
/ 09 января 2009
    static Regex _capitalizedWordPattern = new Regex(@"\b[A-Z][a-z]*\b", RegexOptions.Compiled | RegexOptions.Multiline);

    public static IEnumerable<string> GetDistinctOnlyCapitalizedWords(string text)
    {
        return _capitalizedWordPattern.Matches(text).Cast<Match>().Select(m => m.Value).Distinct();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...