#c# #pattern-matching
#c# #сопоставление с шаблоном
Вопрос:
Я использую класс StreamReader для чтения из текстового файла и загрузки его в список, теперь я хочу выбрать слова с гласными и сохранить их в новом списке, чтобы я мог использовать StreamWriter для записи только выбранных слов в новый текстовый файл
Комментарии:
1. Это может быть любое слово с гласными или без них, важно то, что здесь мне нужно только слово, содержащее только гласные. Например, программирование, загрузка, выбор и т. Д
2. @Michael27 «Программирование» содержит не только гласные
3. Вам действительно нужно поработать над вашим вопросом.
only vowels
,words
,list
вам нужно прояснить многие из них.4. @Oscar извини, что я виноват. Я имел в виду выбрать из списка слов слово, которое содержит только гласную, это более понятно
5. Я думаю, он имеет в виду, что у него есть коллекция строк, и он хочет выбрать только те строки, которые содержат хотя бы одну гласную (хотя не могу представить слишком много естественных языков, в которых есть слова без гласных), но я мог неправильно читать.
Ответ №1:
Чтобы выбрать слова из заданного списка слов (который вы, однако, извлекаете), вы можете выбрать те, которые только содержат гласные, используя Linq:
string vowels = "aeiou";
List<string> words = new List<string>();
//words populated
var vowelWords = words.Where( word => word.All( c => vowels.Contains(c) ))
.ToList();
Если вам просто нужны слова, которые содержат хотя бы гласную (это не совсем понятно из вопроса):
var vowelWords = words.Where( word => word.Any( c => vowels.Contains(c) ))
.ToList();
Редактировать в ответ на комментарий:
Чтобы выбрать слова, содержащие более одной гласной:
var vowelWords = words.Where(word => word.Count(c => vowels.Contains(c)) > 1)
.ToList();
Комментарии:
1. «Если вам просто нужны слова, содержащие хотя бы гласную» У меня вопрос по этому поводу, возможно ли выбрать слова, содержащие более 1 гласной?
2. спасибо, var vowelWords = слова. Где(word => слово. Подсчитайте (c => гласные. Содержит(c)) > 1) .ToList(); это сработало
Ответ №2:
Вот пример, который будет работать. Я написал это в Notepad , так что некоторые ;
или похожие могут отсутствовать. Вы можете адаптировать его к своим потребностям:
//Reading...
List<string> originalWords = new List<string>();
using (var reader = new StreamReader(...)) {
while (!reader.EndOfLine()) {
string line = reader.ReadLine();
var splitted = line.Split(new string[] {" "}, StringSplitOptions.None);
foreach (var word in splitted) {
if (!originalWords.Contains(word)) {
originalWords.Add(word);
}
}
}
}
//Filtering...
List<string> filtered = new List<string>();
string vowels = "aeiou";
foreach (var word in originalWords) {
foreach (var vowel in vowels) {
if (word.Contains(vowel))
filtered.Add(vowel);
break;
}
}
//Writing...
using (var writer = new StreamWriter(...)) {
foreach (var word in filtered) {
writer.WriteLine(word);
}
}
Ответ №3:
Вы можете сделать это довольно быстро с помощью Linq и регулярных выражений
var words = [your code to get them into a collection]
var withVowels = from word in words
where Regex.IsMatch(word, "[AEIOUaeiou]")
select word;
Ответ №4:
Вы также можете сопоставить какое-нибудь регулярное выражение, поскольку, возможно, захотите считать, что y — это гласная. Начните с ([aeiou])|([A-Za-z]y)
, затем двигайтесь дальше, если вам нужно что-то более сложное. http://www.nregex.com/nregex/default.aspx это хорошее место для начала, если вы хотите протестировать свое регулярное выражение.
// Your words go in here
List<string> words;
// is vowelled a word?
var vowelledWords = words.Where(w => Regex.IsMatch(w, "([aeiou])|([A-Za-z]y)"));