#c#
#c#
Вопрос:
У меня есть config.txt файл, который выглядит примерно так
some text here = 5
another text line here = 4 with random garbage
some other line = 2 5 some number 12
7
foo bar 9
Чтобы уточнить, ТОЛЬКО число сразу после » = «. Только одно число, которое отображается после «=»
Я хочу иметь возможность извлекать целые числа ТОЛЬКО после «= «. Итак, в этом случае вывод должен выглядеть следующим образом
5
4
2
Я делал это раньше на C с чем-то вроде этого
if (file_to_read.is_open()) {
file_to_read.ignore(numeric_limits<streamsize>::max(), '=');
while (file_to_read >> input) {
values.push_back(input);
file_to_read.ignore(numeric_limits<streamsize>::max(), '=');
}
file_to_read.close();
Я хочу понять, как вы делаете это на C #, и есть ли какая-либо документация, на которую я могу сослаться
Комментарии:
1. Разве выходные данные не должны быть 5 и 4?
2. Просто используйте
= (d )
регулярное выражение…3. @Альберт Алонсо, да, это должно быть 5 и 4. Извиняюсь за опечатку.
4. Это правильно @RufusL это было
5. Существует много информации о том, как читать текстовый файл с помощью c #, как выполнять цикл
foreach
,for
илиwhile
(для обработки данных файла) и как сравнивать символы с разными значениями. Что вы уже пробовали? Если вы покажете нам, где вы застряли, было бы легче помочь.
Ответ №1:
Используя регулярные выражения, процедура не слишком сложна. Фильтрация при чтении потока кажется слишком сложной для этого. Просто сделайте это:
- Считывает текстовый файл в одну строку
- Используйте регулярное выражение, которое выполняет поиск шаблона, содержащего буквенную
" = "
строку, за которой следуют числовые символыd
. - Заключение числовой части выражения в круглые скобки позволяет записать его в группу # 1, которую вы можете извлечь из
Match
объекта какm.Groups[1].Value
. - Каждое найденное целое число анализируется и добавляется в список целых чисел
-
После операции возвращается список.
public static List<Int32> ExtractInts(String filePath) { String input = File.ReadAllText(filePath); List<Int32> ints = new List<Int32>(); Regex r = new Regex(" = (\d )"); MatchCollection mc = r.Matches(input); foreach(Match m in mc) ints.Add(Int32.Parse(m.Groups[1].Value)); return ints; }
Ответ №2:
Поехали:
string input =
@"some text here = 5
another text line here = 4 with random garbage
some other line = 2 5 some number 12
7
foo bar 9";
var matches = Regex.Matches(input, @"(?:.*(?<==).*)(d )");
foreach(Match match in matches)
{
Console.WriteLine(match.Groups[1]);
}
Вывод:
5
4
2
Для регулярного выражения происходит вот что:
Неселективный поиск любого символа любое количество раз, за которым следует знак ‘=’:
(?:.*(?<==).*)
И это для сопоставления цифр:
(d )
Добро пожаловать. =)
Комментарии:
1. Если вы используете группу захвата, вам не нужен поиск сзади. Вы можете просто использовать литерал » = » перед d.