以下是用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个匹配项,都可以使用一个检查?
答案 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