Primo Chalice Ответов: 1

Как избавиться от ошибки "входная строка была не в правильном формате"?


Привет,

У меня есть следующая строка кода:

int tSectionNo = Convert.ToInt32(Regex.Match(TempSectionTitleArray[icm], "(.+)\\|").Groups[1].Value);


и я получаю следующую ошибку:

Input string was not in a correct format


TempSectionTitleArray
это строковый массив, инициализированный нулем по умолчанию.

Пожалуйста помочь.

С уважением
Аман Чаурасия

Что я уже пробовал:

int tSectionNo = Convert.ToInt32(Regex.Match(TempSectionTitleArray[icm], "(.+)\\|").Groups[1].Value);

1 Ответов

Рейтинг:
2

Jochen Arndt

Не делайте все это в одном заявлении. Используйте операторы, каждый из которых находится в своей собственной строке, присваивая переменную и проверяя ее валидность.

Возможные источники ошибок в вашем коде заключаются в том, что совпадение отсутствует или оно не может быть преобразовано в целое число.

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

@"(.+)\|"

Вы должны использовать что-то вроде (непроверенное):
int tSectionNo = 0;
Match match = Regex.Match(TempSectionTitleArray[icm], @"(.+)\|");
if (match.Success)
{
    // Assign to a variable so that it can be inspected and/or 
    //  added to an error message
    string sub = match.Groups[1].Value;
    if (!Int32.TryParse(sub, out tSectionNo))
    {
        // Not an integer
    }
}
else
{
    // No match
}

[РЕДАКТИРОВАТЬ]
Существует еще один вероятный источник ошибок, когда входная строка содержит несколько | персонажи. Тогда регулярное выражение будет соответствовать всему тексту перед последним | (жадное сопоставление) так что преобразование в int неудачи. Чтобы избежать этого, укажите не жадное (ленивое) сопоставление:
@"(.+?)\|"
[/РЕДАКТИРОВАТЬ]


Primo Chalice

еще
{
TempSectionStringArray = TempSectionString.Расщеплять(' ');
TempSectionTitleArray = TempSectionTitleString.Расщеплять(' ');
bool Sectionswriten = false;
for (var icm = 0; icm < TempSectionTitleArray.Длина; icm++)
{
если (!строка.IsNullOrEmpty(TempSectionTitleArray[icm]))
{
int tSectionNo = конвертировать.ToInt32(Регулярное Выражение.Матч(TempSectionTitleArray[icm], @"(.+)\\|").Группы[1].Значение);
строка tSectionTitle = Convert.ToString(Регулярное Выражение.Матч(TempSectionTitleArray[icm], @"\\|(.+)").группы[1].Значение).Отделка(' ');
строка TStrSectionHead = "";
TStrSectionHead = StrSectionHead;
TStrSectionHead = Регулярное Выражение.Заменить(TStrSectionHead, "в<div с классом=\"имя раздела\"&ГТ;" + TitleTextBox.Text + "", "<div class=\"sectionName\">" + tSectionTitle + "", RegexOptions.Многострочный);

for (var ic = 0; ic < TempSectionStringArray.Длина; ic++)
{
если (!строка.IsNullOrEmpty(TempSectionStringArray[ic]))
{
строка ArticleSectionTitleNo = конвертировать.ToInt32(Регулярное Выражение.Матч(TempSectionStringArray[ic], "(.+)\\|").Группы[1].Значение).Метод toString();
если (ArticleSectionTitleNo == tSectionNo.Метод toString())
{
строка ArticleFileStr = регулярное выражение.Матч(TempSectionStringArray[ic], "\\|(.+)").группы[1].Значение;
foreach (var ArticleFile в dinfo)
{
строка tArtName = null;
tArtName = ArticleFile.Name;
если (tArtName.Содержит(ArticleFileStr))
{
пробовать
{
строка tstrFileContent = "";
tstrFileContent = Common.ReadFile(ArticleFile.Полное имя);
StrSectionBody = StrSectionBody + "<div class=\"article-spacer\"/>" + Environment.NewLine;
StrSectionBody = StrSectionBody + "&ЛТ;див ИД=\"preview_" + ArticleBodyCount + "\" класс=\"sectionArticleBlockOdd\"&ГТ;" + окружающая среда.Строки;
StrSectionBody = StrSectionBody + "<div class=\"sectionArticleTextBlock\">" + Environment.NewLine;
StrSectionBody = StrSectionBody + "<div class=\"sectionArticleTitle\">" + Environment.NewLine;
StrSectionBody = StrSectionBody + "<a class=\"sectionArticleLink\" href=\"" + ArticleFile.Имя + "\">" + Environment.NewLine;
строка ArticleHeadTitle = "";
if (регулярное выражение.IsMatch(tstrFileContent, "<h2 id=.+>(.+?)", RegexOptions.Многострочный))
{
ArticleHeadTitle = Регулярное Выражение.Match(tstrFileContent, "<h2 id=.+>(.+?)"

Jochen Arndt

???

Что вы хотите мне сказать, разместив такую кучу неформатированного кода?

Вы не последовали моему предложению проверить промежуточные результаты. Все, что вы сделали, это использовали префикс @ для строки регулярного выражения, но потерпели неудачу, потому что двойная обратная косая черта все еще существует.

Наконец, если вы хотите получить части до и после символа'|', почему бы не использовать одно регулярное выражение с двумя совпадениями @"(.+?)\|(.+)"?

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

Primo Chalice

Я попробовал выражение, которое вы написали в [EDIT], но ошибка остается. На самом деле я показываю вам код Visual Basic той же строки. В Visual Basic он отлично работает без каких-либо ошибок или ошибок, с тем же регулярным выражением. Код приведен ниже:

Dim tSectionNo As Integer = CInt(регулярное выражение.Матч(TempSectionTitleArray(icm), "(.+)\|").Группы(1).Значение)

Jochen Arndt

Снова:
Разделите утверждение на две части. Затем вы можете использовать отладчик или распечатать детали, чтобы увидеть, где возникает ошибка для какого типа входных данных.

Кроме того, литье с использованием CInt не то же самое, что использование функции преобразования, потому что она менее ограничительна.

Primo Chalice

Я поставил MessageBox, чтобы посмотреть, какие данные хранятся. Он хранит в массиве не более или не более 2 значений, что приводит к ошибке. Если это значение равно 1, то оно работает нормально.

Кроме того, что я должен использовать в качестве альтернативы для CInt в C#?

Jochen Arndt

Хотя я не вижу примера, я не могу помочь.
Итак, что же такое входные строки?
Что возвращает регулярное выражение?
Все ли совпадения являются строками, которые можно преобразовать в int?

Используйте TryParse, как в моем решении.