2015-09-06 5 views
1

У меня есть следующий код. Он работает так, как планировалось, но я просто хотел знать, могу ли я изменить логику, стоящую за ней, чтобы она выглядела проще, потому что я считаю ее излишней.Можно ли упростить эту попытку и логику?

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

  1. Данные получены нормально.
  2. Данные извлекаются, но не содержат числа. Поэтому передается другое регулярное выражение.
  3. Данные не получены. Такое же регулярное выражение, как и 2).(это то, что я считаю, может быть упрощена или оптимизированы)

Сначала я подумал, что может быть способ проверки, если регулярное выражение возвращает пустой или нет, не бросать исключение, но (поправьте меня если я ошибаюсь), нет такой вещи ... поэтому я включил try/catch. Без него, если 3-й случай встречен, IF возвращает исключение, потому что он говорит, что m2[0].Groups[1].Captures[0].Value, конечно, вне границ (потому что он пуст).

Итак ... есть ли способ сделать этот взгляд более оптимизированным? Большое спасибо!

string regexString = @"&nbsp;\.\.\.&nbsp;.*?>(.*?)<\/a>"; 
MatchCollection m2 = Regex.Matches(myInput, regexString, RegexOptions.Singleline); 

try 
{ 
    if (m2[0].Groups[1].Captures[0].Value.All(Char.IsDigit) == false) 
    { 
     regexString = @"page=.*?"">(.*?)</a>\n.*?<a class=""pagebtn"""; 
     m2 = Regex.Matches(myInput, regexString); 
    } 
} 
catch (ArgumentException) 
{ 
    regexString = @"page=.*?"">(.*?)</a>\n.*?<a class=""pagebtn"""; 
    m2 = Regex.Matches(myInput, regexString); 
} 
+4

Вы должны решить исключение. Какое конкретное высказывание выдает, 'm2 [0] .Groups [1]. Захваты [0]. Значение. Думаю? Это строка, поэтому достаточно 'string.IsNullOrWhiteSpace()'. Экземпляр 'Regex' имеет свойство' bool IsMatch', которое вы можете проверить. – CodeCaster

+0

Единственный способ решить это будет проверять, является ли результат регулярного выражения пустым. И это часть моего вопроса, потому что я понятия не имею, можно ли это сделать. Вот почему я использую try/catch. – Arturo

+0

@CodeCaster Использование Regex.IsMatch потребует от меня ввода точной строки, которую я ожидаю получить, не так ли? Но дело в том, что я знаю только, что он должен быть целым числом, и больше ничего. – Arturo

ответ

2

Я предполагаю, что более точное описание вашей проблемы является то, что вы хотите, чтобы разобрать значение, которое может или не может быть там, как целое, но ваш m2[0].Groups[1].Captures[0].Value.All(Char.IsDigit) бросает если Value является null.

Это может быть упрощена, чтобы что-то вроде этого:

int parsedValue = 0; 
if (m2[0].Success) 
{ 
    var value = m2[0].Groups[1].Captures[0].Value; 
    if (!string.IsNullOrWhiteSpace(value)) 
    { 
     if (int.TryParse(value, out parsedValue)) 
     { 
      // do something with parsedValue, or with the fact that the value exists and is an integer 
     } 
    } 
} 
2

Вы можете проверить это с IsMatch, и если он не совпадает, попробуйте ваш второй регулярное выражение, если нет, то ничего не соответствует

Regex normalRegex = new Regex(@"&nbsp;\.\.\.&nbsp;.*?>(.*?)<\/a>", RegexOptions.SingleLine); 
Regex secondaryRegex = new Regex(@"page=.*?"">(.*?)</a>\n.*?<a class=""pagebtn"""); 
int valueFound; 
bool numberParsed; 

if (normalRegex.IsMatch(myInput)) { 
    // your code to check here 
    // use int.TryParse to parse your value and add the result to 
    numberParsed = int.TryParse(m2[0].Groups[1].Captures[0].Value, out valueFound); 
} 
if (!numberParsed) { 
    if (secondaryRegex.IsMatch(myInput)) { 
     // second code matches 
    } else { 
     // no match 
    } 
} 

В этом случае вам не очень нужна ваша попытка/поймать

+0

С IsMatch мне нужно точно знать, что является результатом. Должен ли я использовать. Успех, как предлагает другой ответ? – Arturo

+1

может быть так, но вы могли бы легко адаптировать логику этого, я редактировал свой пост @Arturo – Icepickle

Смежные вопросы