Рейтинг:
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, как в моем решении.