2013-04-25 64 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