1

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

我知道我可以通过使用星号 ( *) 而不是加号 ( ) 来使字符可选+。然而,当与曲线牙套结合使用时,这似乎不起作用()

换句话说,我认为这应该有效,但事实并非如此。它返回零结果,除非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 个匹配项,都可以使用一项检查?

4

3 回答 3

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,}这是+.

于 2013-04-25T07:51:45.893 回答
1

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

为你工作?

实际上,您可能正在使用*而不是,?*可能匹配多个匹配项,并且据我所读,您想要一个或零个匹配项。如有必要,您可以嵌套大括号。

于 2013-04-25T07:50:01.593 回答
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
于 2013-04-25T07:52:13.623 回答