【问题标题】:How can I make optional matches?如何进行可选匹配?
【发布时间】:2013-04-19 00:18:05
【问题描述】:

以下是用 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]*)

如何使第二个和第三个匹配项,() 中的部分,可选,以便无论字符串包含 1、2 还是 3 个匹配项,都可以使用一次检查?

【问题讨论】:

  • 您可能想提供一些示例来说明这些正则表达式应该匹配的内容。
  • 你可以试试a((b)?(c)?)?

标签: regex autoit


【解决方案1】:

可以使用量词?,表示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,} 表示它至少匹配一个。这是+的加长版。

【讨论】:

  • 完美运行,谢谢。没有意识到您可以将() 嵌套在() 中,并且只有最里面的那个会被认为是“匹配”。
【解决方案2】:

试试这个方法:

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

【讨论】:

    【解决方案3】:

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

    为你工作?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多