2015-09-06 72 views
1

我有以下代碼。它按預期工作,但我只想知道是否可以改變它背後的邏輯,使其看起來更簡單,因爲我相信這是多餘的。是否有可能簡化這種嘗試捕捉和邏輯?

它的工作原理是這樣的:我獲取一些數據,然後嘗試通過正則表達式傳遞它。有三種可能的結果:

  1. 數據提取正常。
  2. 提取數據但不包含數字。所以又傳遞了另一個正則表達式。
  3. 數據未被提取。 與2)相同的正則表達式已通過。(這是我認爲可以簡化或優化)

起初,我認爲有可能是,如果正則表達式返回空或沒有拋出異常檢查的一種方式,但(指正如果我錯了),就不會有這樣的事情......所以這就是爲什麼我包含try/catch的原因。沒有它,如果滿足第三種情況,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] .Captures [0] .Value'我猜?這是一個字符串,所以'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)將引發Valuenull

,然後可以簡化爲這樣的事:

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我需要知道到底是什麼結果。不應該使用.Success作爲其他答案的建議? – Arturo

+1

也許是這樣,但你可以很容易地適應它的邏輯,我編輯我的帖子@Arturo – Icepickle