2013-04-25 66 views
1

以下內容是用AutoIt腳本編寫的,但問題一般是關於正則表達式。如何進行可選匹配?

Func GetNthValueFromStatubar($n) 
    ; Get status text as string. 
    $Status = StatusbarGetText($MainWindowTitle) 
    ; Find value based on N. 
    If $n = 1 Then 
     $Result = StringRegExp($Status, "[A-Za-z: ]+\$([A-Z0-9]+)", 1) 
    ElseIf $n = 2 Then 
     $Result = StringRegExp($Status, "[A-Za-z: ]+\$([A-Z0-9]+)[\s]*[A-Za-z: ]+\$([A-Z0-9]+)", 1) 
    ElseIf $n = 3 Then 
     $Result = StringRegExp($Status, "[A-Za-z: ]+\$([A-Z0-9]+)[\s]*[A-Za-z: ]+\$([A-Z0-9]+)[\s]*[A-Za-z: ]+\$([A-Z0-9]+)", 1) 
    EndIf 
    Return $Result[$n - 1] 
EndFunc 

我想消除if語句,只寫一個正則表達式檢查。要做到這一點,我認爲第二場和第三場比賽必須是可選的。

我知道我可以通過使用星號(*)而不是加號(+)來使字符可選。但是,當與曲線牙套()結合使用時,這似乎不起作用。

換句話說,我認爲這應該工作,但它不。它返回結果爲零,除非N = 3

[A-Za-z: ]+\$([A-Z0-9]+)[\s]*[A-Za-z: ]*\$([A-Z0-9]*)[\s]*[A-Za-z: ]*\$([A-Z0-9]*)

我怎樣才能使第二和第三場比賽,內()零件,可選的,所以一個檢查可以不管使用的字符串是否包含1,2 ,還是3場比賽?

+0

您可能要提供什麼樣這些正則表達式都應該是匹配的一些例子。 – 2013-04-25 07:48:24

+0

你可以嘗試類似'a((b)?(c)?)?' – HamZa 2013-04-25 07:50:02

回答

2

您可以使用量詞?,表示0或1.它是{0,1}的簡寫形式。然後,您的正則表達式應該是這樣的:

[A-Za-z: ]+\$([A-Z0-9]+)([\s]*[A-Za-z: ]+\$([A-Z0-9]+))?([\s]*[A-Za-z: ]+\$([A-Z0-9]+))? 

但由於可選的表達是一樣的,你可以說比賽的那部分0,1或2次這樣的:

[A-Za-z: ]+\$([A-Z0-9]+)([\s]*[A-Za-z: ]+\$([A-Z0-9]+)){0,2} 

的量詞{0,2}作品這種方式{min,max},其中min定義了所需重複的最小數量和max的最大值。
您也可以省略max部分{1,}表示它至少會匹配一個。這是+的長版本。

+0

完美的作品謝謝你。沒有意識到你可以在'()'中嵌入'()',只有最內層的被認爲是「匹配」。 – Joncom 2013-04-25 08:02:39

1

(rexex1)(optional regex1)?(optional regex2)?

爲您工作?

其實你可以使用*代替?*可以匹配多於一個的發生而據我讀你想一個或零匹配代替。如有必要,您可以嵌套大括號。

0

試試這個方法:

Func GetNthValueFromStatubar($n) 

    ; Get status text as string.  
    $Status = StatusbarGetText($MainWindowTitle) 

    ;define regex 
    $reg = "[A-Za-z: ]+\$([A-Z0-9]+)"; 

    ; Find value based on N. 
    for($i=2; $i<=$n; $i++) 
    { 
     $reg .= "[\s]*".$reg; 
    } 
    $Result = StringRegExp($Status, $reg, 1) 

    Return $Result[$n - 1] 
EndFunc