如何进行可选匹配?

时间:2013-04-25 07:44:33

标签: regex autoit

以下是用AutoIt Script编写的,但问题是关于正则表达式。

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语句并只写一个正则表达式检查。要做到这一点,我认为第二和第三场比赛必须是可选的。

我知道我可以使用星号(*)代替加号(+)来使字符成为可选字符。但是,当与curvey括号()结合使用时,这似乎不起作用。

换句话说,我认为这应该有效,但事实并非如此。除N = 3

外,它返回零结果

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

如何将()中的第2和第3个匹配项置于可选状态,以便无论字符串是包含1,2或3个匹配项,都可以使用一个检查?

3 个答案:

答案 0 :(得分: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,}表示它至少匹配一个。这是+的长版本。

答案 1 :(得分:1)

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

为你工作?

实际上,您可能正在使用*而不是?,但*可能会匹配多个匹配项,就我读到的而言,您希望使用一个或零匹配。如有必要,你可以嵌套括号。

答案 2 :(得分: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