seeking 发表于 2015-6-24 17:54:45

[已解决]正则表达式出错:直接退出程序

本帖最后由 seeking 于 2015-6-27 10:26 编辑

最近在写一个代码迷惑的程序,里面由虫子樱桃提供的一个Bug。

代码见下面,用(?i)(?s)\r\n\s*func\s+\b_ArrayDisplay\b(?:(?!EndFunc).)+\n\s*\bEndFunc\b匹配函数体,直接退出,没有任何出错提示。
用的是Afan大大的Au3.REHelper。
百思不得其解,请教大家。Func _ArrayDisplay(Const ByRef $avArray, $sTitle = Default, $sArray_Range = Default, $iFlags = Default, $vUser_Separator = Default, $sHeader = Default, $iMax_ColWidth = Default, $iAlt_Color = Default, $hUser_Func = Default)

        ; Default values
        If $sTitle = Default Then $sTitle = "ArrayDisplay"
        If $sArray_Range = Default Then $sArray_Range = ""
        If $iFlags = Default Then $iFlags = 0
        If $vUser_Separator = Default Then $vUser_Separator = ""
        If $sHeader = Default Then $sHeader = ""
        If $iMax_ColWidth = Default Then $iMax_ColWidth = 350
        If $iAlt_Color = Default Then $iAlt_Color = 0
        If $hUser_Func = Default Then $hUser_Func = 0

        ; Check for transpose, column align, verbosity and button and "Row" column visibility
        Local $iTranspose = BitAND($iFlags, 1)
        Local $iColAlign = BitAND($iFlags, 6) ; 0 = Left (default); 2 = Right; 4 = Center
        Local $iVerbose = BitAND($iFlags, 8)
        Local $iButtonMargin = ((BitAND($iFlags, 32)) ? (0) : ((BitAND($iFlags, 16)) ? (20) : (40))) ; Flag 32 = 0; flag 16 = 20; neither flag = 40
        Local $iNoRow =BitAND($iFlags, 64)

        ; Check valid array
        Local $sMsg = "", $iRet = 1
        If IsArray($avArray) Then
                ; Dimension checking
                Local $iDimension = UBound($avArray, $UBOUND_DIMENSIONS), $iRowCount = UBound($avArray, $UBOUND_ROWS), $iColCount = UBound($avArray, $UBOUND_COLUMNS)
                If $iDimension > 2 Then
                        $sMsg = "转递的数组大于 2D"
                        $iRet = 2
                EndIf
        Else
                $sMsg = "没有转递数组变量"
        EndIf
        If $sMsg Then
                If $iVerbose And MsgBox($MB_SYSTEMMODAL + $MB_ICONERROR + $MB_YESNO, _
                                "显示数组发生错误: " & $sTitle, $sMsg & @CRLF & @CRLF & "退出脚本吗?") = $IDYES Then
                        Exit
                Else
                        Return SetError($iRet, 0, "")
                EndIf
        EndIf

        ; Determine copy separator
        Local $iCW_ColWidth = Number($vUser_Separator)

        ; Separator handling
        Local $sAD_Separator = ChrW(0xFAB1)
        ; Set separator to use in this UDF and store existing one
        Local $sCurr_Separator = Opt("GUIDataSeparatorChar", $sAD_Separator)
        ; Set default user separator if required
        If $vUser_Separator = "" Then $vUser_Separator = $sCurr_Separator

        ; Declare variables
        Local $vTmp, $iRowLimit = 65525, $iColLimit = 250 ; Row = AutoIt 64k limit minus UDF controls; Column - arbitrary limit

        ; Set original dimensions for data display
        Local $iDataRow = $iRowCount
        Local $iDataCol = $iColCount

        ; Set display limits for dimensions - column value only set for 2D arrays
        Local $iItem_Start = 0, $iItem_End = $iRowCount - 1, $iSubItem_Start = 0, $iSubItem_End = (($iDimension = 2) ? ($iColCount - 1) : (0))
        ; Flag to determine if range set
        Local $bRange_Flag = False
        ; Check for range settings
        If $sArray_Range Then
                ; Split into separate dimension sections
                Local $aArray_Range = StringRegExp($sArray_Range & "||", "(?U)(.*)\|", 3)
                ; Dimension 1
                Local $avRangeSplit = StringSplit($aArray_Range, ":")
                If @error Then
                        If Number($avRangeSplit) Then
                                $iItem_End = Number($avRangeSplit)
                        EndIf
                Else
                        $iItem_Start = Number($avRangeSplit)
                        If Number($avRangeSplit) Then
                                $iItem_End = Number($avRangeSplit)
                        EndIf
                EndIf
                ; Ckeck row bounds
                If $iItem_Start > $iItem_End Then
                        $vTmp = $iItem_Start
                        $iItem_Start = $iItem_End
                        $iItem_End = $vTmp
                EndIf
                If $iItem_Start < 0 Then $iItem_Start = 0
                If $iItem_End > $iRowCount - 1 Then $iItem_End = $iRowCount - 1
                ; Check if range set
                If $iItem_Start <> 0 Or $iItem_End <> $iRowCount - 1 Then $bRange_Flag = True
                ; Dimension 2
                If $iDimension = 2 Then
                        $avRangeSplit = StringSplit($aArray_Range, ":")
                        If @error Then
                                If Number($avRangeSplit) Then
                                        $iSubItem_End = Number($avRangeSplit)
                                EndIf
                        Else
                                $iSubItem_Start = Number($avRangeSplit)
                                If Number($avRangeSplit) Then
                                        $iSubItem_End = Number($avRangeSplit)
                                EndIf
                        EndIf
                        ; Check column bounds
                        If $iSubItem_Start > $iSubItem_End Then
                                $vTmp = $iSubItem_Start
                                $iSubItem_Start = $iSubItem_End
                                $iSubItem_End = $vTmp
                        EndIf
                        If $iSubItem_Start < 0 Then $iSubItem_Start = 0
                        If $iSubItem_End > $iColCount - 1 Then $iSubItem_End = $iColCount - 1
                        ; Check if range set
                        If $iSubItem_Start <> 0 Or $iSubItem_End <> $iColCount - 1 Then $bRange_Flag = True
                EndIf
        EndIf

        ; Create data display
        Local $sDisplayData = "[" & $iDataRow
        ; Check if rows will be truncated
        Local $bTruncated = False
        If $iTranspose Then
                If $iItem_End - $iItem_Start > $iColLimit Then
                        $bTruncated = True
                        $iItem_End = $iItem_Start + $iColLimit - 1
                EndIf
        Else
                If $iItem_End - $iItem_Start > $iRowLimit Then
                        $bTruncated = True
                        $iItem_End = $iItem_Start + $iRowLimit - 1
                EndIf
        EndIf
        If $bTruncated Then
                $sDisplayData &= "*]"
        Else
                $sDisplayData &= "]"
        EndIf
        If $iDimension = 2 Then
                $sDisplayData &= " [" & $iDataCol
                If $iTranspose Then
                        If $iSubItem_End - $iSubItem_Start > $iRowLimit Then
                                $bTruncated = True
                                $iSubItem_End = $iSubItem_Start + $iRowLimit - 1
                        EndIf
                Else
                        If $iSubItem_End - $iSubItem_Start > $iColLimit Then
                                $bTruncated = True
                                $iSubItem_End = $iSubItem_Start + $iColLimit - 1
                        EndIf
                EndIf
                If $bTruncated Then
                        $sDisplayData &= "*]"
                Else
                        $sDisplayData &= "]"
                EndIf
        EndIf
        ; Create tooltip data
        Local $sTipData = ""
        If $bTruncated Then $sTipData &= "被截断"
        If $bRange_Flag Then
                If $sTipData Then $sTipData &= " - "
                $sTipData &= "范围设置"
        EndIf
        If $iTranspose Then
                If $sTipData Then $sTipData &= " - "
                $sTipData &= "换位"
        EndIf

        ; Split custom header on separator
        Local $asHeader = StringSplit($sHeader, $sCurr_Separator, $STR_NOCOUNT) ; No count element
        If UBound($asHeader) = 0 Then Local $asHeader = [""]
        $sHeader = "Row"
        Local $iIndex = $iSubItem_Start
        If $iTranspose Then
                ; All default headers
                For $j = $iItem_Start To $iItem_End
                        $sHeader &= $sAD_Separator & "Col " & $j
                Next
        Else
                ; Create custom header with available items
                If $asHeader Then
                        ; Set as many as available
                        For $iIndex = $iSubItem_Start To $iSubItem_End
                                ; Check custom header available
                                If $iIndex >= UBound($asHeader) Then ExitLoop
                                $sHeader &= $sAD_Separator & $asHeader[$iIndex]
                        Next
                EndIf
                ; Add default headers to fill to end
                For $j = $iIndex To $iSubItem_End
                        $sHeader &= $sAD_Separator & "Col " & $j
                Next
        EndIf
        ; Remove "Row" header if not needed
        If $iNoRow Then $sHeader = StringTrimLeft($sHeader, 4)

        ; Display splash dialog if required
        If $iVerbose And ($iItem_End - $iItem_Start + 1) * ($iSubItem_End - $iSubItem_Start + 1) > 10000 Then
                SplashTextOn("ArrayDisplay", "准备显示" & @CRLF & @CRLF & "请耐心等待", 300, 100)
        EndIf

        ; Convert array into ListViewItem compatible lines
        Local $iBuffer = 4094 ; Max characters a ListView will display (Windows limitation)
        If $iTranspose Then
                ; Swap dimensions
                $vTmp = $iItem_Start
                $iItem_Start = $iSubItem_Start
                $iSubItem_Start = $vTmp
                $vTmp = $iItem_End
                $iItem_End = $iSubItem_End
                $iSubItem_End = $vTmp
        EndIf
        Local $avArrayText[$iItem_End - $iItem_Start + 1]
        For $i = $iItem_Start To $iItem_End
                ; Add row number if required
                If Not $iNoRow Then $avArrayText[$i - $iItem_Start] = "[" & $i & "]"
                For $j = $iSubItem_Start To $iSubItem_End
                        If $iDimension = 1 Then
                                If $iTranspose Then
                                        $vTmp = $avArray[$j]
                                Else
                                        $vTmp = $avArray[$i]
                                EndIf
                        Else
                                If $iTranspose Then
                                        $vTmp = $avArray[$j][$i]
                                Else
                                        $vTmp = $avArray[$i][$j]
                                EndIf
                        EndIf
                        ; Truncate if required so ListView will display
                        If StringLen($vTmp) > $iBuffer Then $vTmp = StringLeft($vTmp, $iBuffer)
                        $avArrayText[$i - $iItem_Start] &= $sAD_Separator & $vTmp
                Next
                ; Remove leading delimiter if no "Row" column
                If $iNoRow Then $avArrayText[$i - $iItem_Start] = StringTrimLeft($avArrayText[$i - $iItem_Start], 1)
        Next

        ; GUI Constants
        Local Const $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 64
        Local Const $_ARRAYCONSTANT_GUI_DOCKBORDERS = 102
        Local Const $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 512
        Local Const $_ARRAYCONSTANT_GUI_DOCKLEFT = 2
        Local Const $_ARRAYCONSTANT_GUI_DOCKRIGHT = 4
        Local Const $_ARRAYCONSTANT_GUI_DOCKHCENTER = 8
        Local Const $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3
        Local Const $_ARRAYCONSTANT_GUI_FOCUS = 256
        Local Const $_ARRAYCONSTANT_GUI_BKCOLOR_LV_ALTERNATE = 0xFE000000
        Local Const $_ARRAYCONSTANT_SS_CENTER = 0x1
        Local Const $_ARRAYCONSTANT_SS_CENTERIMAGE = 0x0200
        Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4)
        Local Const $_ARRAYCONSTANT_LVM_GETITEMRECT = (0x1000 + 14)
        Local Const $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH = (0x1000 + 29)
        Local Const $_ARRAYCONSTANT_LVM_SETCOLUMNWIDTH = (0x1000 + 30)
        Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44)
        Local Const $_ARRAYCONSTANT_LVM_GETSELECTEDCOUNT = (0x1000 + 50)
        Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
        Local Const $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 0x1
        Local Const $_ARRAYCONSTANT_LVIS_SELECTED = 0x2
        Local Const $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 0x8
        Local Const $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 0x20
        Local Const $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 0x0200
        Local Const $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 0x00010000
        Local Const $_ARRAYCONSTANT_WS_MINIMIZEBOX = 0x00020000
        Local Const $_ARRAYCONSTANT_WS_SIZEBOX = 0x00040000
        Local Const $_ARRAYCONSTANT_WM_SETREDRAW = 11
        Local Const $_ARRAYCONSTANT_LVSCW_AUTOSIZE = -1

        ; Create GUI
        Local $iOrgWidth = 210, $iHeight = 200, $iMinSize = 250
        Local $hGUI = GUICreate($sTitle, $iOrgWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
        Local $aiGUISize = WinGetClientSize($hGUI)
        Local $iButtonWidth_2 = $aiGUISize / 2
        Local $iButtonWidth_3 = $aiGUISize / 3
        ; Create ListView
        Local $idListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize, $aiGUISize - $iButtonMargin, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
        GUICtrlSetBkColor($idListView, $_ARRAYCONSTANT_GUI_BKCOLOR_LV_ALTERNATE)
        GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES)
        GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT)
        GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE)
        Local $idCopy_ID = 9999, $idCopy_Data = 99999, $idData_Label = 99999, $idUser_Func = 99999, $idExit_Script = 99999
        ; Check if any buttons required
        If $iButtonMargin Then
                ; Create Copy buttons
                $idCopy_ID = GUICtrlCreateButton("全部复制", 0, $aiGUISize - $iButtonMargin, $iButtonWidth_2, 20)
                $idCopy_Data = GUICtrlCreateButton("仅复制数据", $iButtonWidth_2, $aiGUISize - $iButtonMargin, $iButtonWidth_2, 20)
                ; Check if other buttons are required
                If $iButtonMargin = 40 Then
                        Local $iButtonWidth_Var = $iButtonWidth_2
                        Local $iOffset = $iButtonWidth_2
                        If IsFunc($hUser_Func) Then
                                ; Create UserFunc button if function passed
                                $idUser_Func = GUICtrlCreateButton("运行用户函数", $iButtonWidth_3, $aiGUISize - 20, $iButtonWidth_3, 20)
                                $iButtonWidth_Var = $iButtonWidth_3
                                $iOffset = $iButtonWidth_3 * 2
                        EndIf
                        ; Create Exit button and data label
                        $idExit_Script = GUICtrlCreateButton("退出脚本", $iOffset, $aiGUISize - 20, $iButtonWidth_Var, 20)
                        $idData_Label = GUICtrlCreateLabel($sDisplayData, 0, $aiGUISize - 20, $iButtonWidth_Var, 18, BitOR($_ARRAYCONSTANT_SS_CENTER, $_ARRAYCONSTANT_SS_CENTERIMAGE))
                        ; Change label colour and create tooltip if required
                        Select
                                Case $bTruncated Or $iTranspose Or $bRange_Flag
                                        GUICtrlSetColor($idData_Label, 0xFF0000)
                                        GUICtrlSetTip($idData_Label, $sTipData)
                        EndSelect
                EndIf
        EndIf
        ; Set resizing
        GUICtrlSetResizing($idListView, $_ARRAYCONSTANT_GUI_DOCKBORDERS)
        GUICtrlSetResizing($idCopy_ID, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
        GUICtrlSetResizing($idCopy_Data, $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
        GUICtrlSetResizing($idData_Label, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
        GUICtrlSetResizing($idUser_Func, $_ARRAYCONSTANT_GUI_DOCKHCENTER + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
        GUICtrlSetResizing($idExit_Script, $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)

        ; Start ListView update
        GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_WM_SETREDRAW, 0, 0)

        ; Fill listview
        Local $idItem
        For $i = 0 To UBound($avArrayText) - 1
                $idItem = GUICtrlCreateListViewItem($avArrayText[$i], $idListView)
                If $iAlt_Color Then
                        GUICtrlSetBkColor($idItem, $iAlt_Color)
                EndIf
        Next

        ; Align columns if required - $iColAlign = 2 for Right and 4 for Center
        If $iColAlign Then
                Local Const $_ARRAYCONSTANT_LVCF_FMT = 0x01
                Local Const $_ARRAYCONSTANT_LVM_SETCOLUMNW = (0x1000 + 96)
                Local $tColumn = DllStructCreate("uint Mask;int Fmt;int CX;ptr Text;int TextMax;int SubItem;int Image;int Order;int cxMin;int cxDefault;int cxIdeal")
                DllStructSetData($tColumn, "Mask", $_ARRAYCONSTANT_LVCF_FMT)
                DllStructSetData($tColumn, "Fmt", $iColAlign / 2) ; Left = 0; Right = 1; Center = 2
                Local $pColumn = DllStructGetPtr($tColumn)
                ; Loop through columns
                For $i = 1 To $iSubItem_End - $iSubItem_Start + 1
                        GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETCOLUMNW, $i, $pColumn)
                Next
        EndIf

        ; End ListView update
        GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_WM_SETREDRAW, 1, 0)

        ; Allow for borders with and without vertical scrollbar
        Local $iBorder = 45
        If UBound($avArrayText) > 20 Then
                $iBorder += 20
        EndIf
        ; Adjust dialog width
        Local $iWidth = $iBorder, $iColWidth = 0, $aiColWidth[$iSubItem_End - $iSubItem_Start + 2], $iMin_ColWidth = 55
        ; Get required column widths to fit items
        For $i = 0 To $iSubItem_End - $iSubItem_Start + 1
                GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETCOLUMNWIDTH, $i, $_ARRAYCONSTANT_LVSCW_AUTOSIZE)
                $iColWidth = GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
                ; Set minimum if required
                If $iColWidth < $iMin_ColWidth Then
                        GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETCOLUMNWIDTH, $i, $iMin_ColWidth)
                        $iColWidth = $iMin_ColWidth
                EndIf
                ; Add to total width
                $iWidth += $iColWidth
                ; Storevalue
                $aiColWidth[$i] = $iColWidth
        Next
        ; Reduce width if no "Row" colukm
        If $iNoRow Then $iWidth -= 55
        ; Now check max size
        If $iWidth > @DesktopWidth - 100 Then
                ; Apply max col width limit to reduce width
                $iWidth = $iBorder
                For $i = 0 To $iSubItem_End - $iSubItem_Start + 1
                        If $aiColWidth[$i] > $iMax_ColWidth Then
                                ; Reset width
                                GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_SETCOLUMNWIDTH, $i, $iMax_ColWidth)
                                $iWidth += $iMax_ColWidth
                        Else
                                ; Retain width
                                $iWidth += $aiColWidth[$i]
                        EndIf
                Next
        EndIf
        ; Check max/min width
        If $iWidth > @DesktopWidth - 100 Then
                $iWidth = @DesktopWidth - 100
        ElseIf $iWidth < $iMinSize Then
                $iWidth = $iMinSize
        EndIf

        ; Get row height
        Local $tRect = DllStructCreate("struct; long Left;long Top;long Right;long Bottom; endstruct") ; $tagRECT
        DllCall("user32.dll", "struct*", "SendMessageW", "hwnd", GUICtrlGetHandle($idListView), "uint", $_ARRAYCONSTANT_LVM_GETITEMRECT, "wparam", 0, "struct*", $tRect)
        ; Set required GUI height
        Local $aiWin_Pos = WinGetPos($hGUI)
        Local $aiLV_Pos = ControlGetPos($hGUI, "", $idListView)
        $iHeight = ((UBound($avArrayText) + 2) * (DllStructGetData($tRect, "Bottom") - DllStructGetData($tRect, "Top"))) + $aiWin_Pos - $aiLV_Pos
        ; Check min/max height
        If $iHeight > @DesktopHeight - 100 Then
                $iHeight = @DesktopHeight - 100
        ElseIf $iHeight < $iMinSize Then
                $iHeight = $iMinSize
        EndIf

        SplashOff()

        ; Display and resize dialog
        GUISetState(@SW_HIDE, $hGUI)
        WinMove($hGUI, "", (@DesktopWidth - $iWidth) / 2, (@DesktopHeight - $iHeight) / 2, $iWidth, $iHeight)
        GUISetState(@SW_SHOW, $hGUI)

        ; Switch to GetMessage mode
        Local $iOnEventMode = Opt("GUIOnEventMode", 0), $iMsg

        While 1

                $iMsg = GUIGetMsg() ; Variable needed to check which "Copy" button was pressed
                Switch $iMsg
                        Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
                                ExitLoop

                        Case $idCopy_ID, $idCopy_Data
                                ; Count selected rows
                                Local $iSel_Count = GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_GETSELECTEDCOUNT, 0, 0)
                                ; Display splash dialog if required
                                If $iVerbose And (Not $iSel_Count) And ($iItem_End - $iItem_Start) * ($iSubItem_End - $iSubItem_Start) > 10000 Then
                                        SplashTextOn("ArrayDisplay", "复制数据" & @CRLF & @CRLF & "请耐心等待", 300, 100)
                                EndIf
                                ; Generate clipboard text
                                Local $sClip = "", $sItem, $aSplit
                                ; Add items
                                For $i = 0 To $iItem_End - $iItem_Start
                                        ; Skip if copying selected rows and item not selected
                                        If $iSel_Count And Not (GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, $_ARRAYCONSTANT_LVIS_SELECTED)) Then
                                                ContinueLoop
                                        EndIf
                                        $sItem = $avArrayText[$i]
                                        If $iMsg = $idCopy_Data Then
                                                ; Remove row ID if required
                                                $sItem = StringRegExpReplace($sItem, "^\[\d+\].(.*)$", "$1")
                                        EndIf
                                        If $iCW_ColWidth Then
                                                ; Expand columns
                                                $aSplit = StringSplit($sItem, $sAD_Separator)
                                                $sItem = ""
                                                For $j = 1 To $aSplit
                                                        $sItem &= StringFormat("%-" & $iCW_ColWidth + 1 & "s", StringLeft($aSplit[$j], $iCW_ColWidth))
                                                Next
                                        Else
                                                ; Use defined separator
                                                $sItem = StringReplace($sItem, $sAD_Separator, $vUser_Separator)
                                        EndIf
                                        $sClip &= $sItem & @CRLF
                                Next
                                ; Add header line if required
                                If $iMsg = $idCopy_ID Then
                                        If $iCW_ColWidth Then
                                                $aSplit = StringSplit($sHeader, $sAD_Separator)
                                                $sItem = ""
                                                For $j = 1 To $aSplit
                                                        $sItem &= StringFormat("%-" & $iCW_ColWidth + 1 & "s", StringLeft($aSplit[$j], $iCW_ColWidth))
                                                Next
                                        Else
                                                $sItem = StringReplace($sHeader, $sAD_Separator, $vUser_Separator)
                                        EndIf
                                        $sClip = $sItem & @CRLF & $sClip
                                EndIf
                                ;Send to clipboard
                                ClipPut($sClip)
                                ; Remove splash if used
                                SplashOff()
                                ; Refocus ListView
                                GUICtrlSetState($idListView, $_ARRAYCONSTANT_GUI_FOCUS)

                        Case $idUser_Func
                                ; Get selected indices
                                Local $aiSelItems[$iRowLimit] =
                                For $i = 0 To GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0)
                                        If GUICtrlSendMsg($idListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, $_ARRAYCONSTANT_LVIS_SELECTED) Then
                                                $aiSelItems += 1
                                                $aiSelItems[$aiSelItems] = $i + $iItem_Start
                                        EndIf
                                Next
                                ReDim $aiSelItems[$aiSelItems + 1]
                                ; Pass array and selection to user function
                                $hUser_Func($avArray, $aiSelItems)
                                GUICtrlSetState($idListView, $_ARRAYCONSTANT_GUI_FOCUS)

                        Case $idExit_Script
                                ; Clear up
                                GUIDelete($hGUI)
                                Exit
                EndSwitch
        WEnd

        ; Clear up
        GUIDelete($hGUI)
        Opt("GUIOnEventMode", $iOnEventMode) ; Reset original GUI mode
        Opt("GUIDataSeparatorChar", $sCurr_Separator) ; Reset original separator

        Return 1

EndFunc   ;==>_ArrayDisplay

haijie1223 发表于 2015-6-24 21:19:08

经测试没有退出,但是也没有匹配到。匹配个函数体用的着这么长的正则吗?下面的行不行?(?i)(?s)Func.*?EndFunc.*\r

seeking 发表于 2015-6-24 22:15:23

正则只是获取 _ArrayDisplay这个函数的函数体。
用上面的表达式只是奇怪为什么会退出或者不能匹配?
我用的Au3.REHelper是1.0.9.9

afan 发表于 2015-6-24 22:53:32

(?:(?!EndFunc).)这里在处理较多数据时容易出问题,尽量少用吧~ 试试以下(?si)(?:^|\n)\h*func\h+_ArrayDisplay\h*\(\V+.*?\n\h*EndFunc\b

seeking 发表于 2015-6-25 17:25:05

感谢Afan的解答,谢谢

lpxx 发表于 2015-6-25 21:09:59

(?:(?!EndFunc).)这里在处理较多数据时容易出问题,尽量少用吧~ 试试以下
afan 发表于 2015-6-24 22:53 http://www.autoitx.com/images/common/back.gif


    A大的回答总能给我很多启示

seeking 发表于 2015-6-25 21:58:04

回复 4# afan


    不过最好还是:(?si)(?:^|\r\n)\h*func\h+_ArrayDisplay\h*\(\V+.*?\n\h*EndFunc\b

afan 发表于 2015-6-26 10:23:20

回复afan


    不过最好还是:(?si)(?:^|\r\n)\h*func\h+_ArrayDisplay\h*\(\V+.*?\n\h*EndFunc\b
seeking 发表于 2015-6-25 21:58 http://www.autoitx.com/images/common/back.gif


    如果是验证函数存在之前的就行了,如果要捕获函数则需要简单修改下
页: [1]
查看完整版本: [已解决]正则表达式出错:直接退出程序