[已解决]正则表达式出错:直接退出程序
本帖最后由 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
经测试没有退出,但是也没有匹配到。匹配个函数体用的着这么长的正则吗?下面的行不行?(?i)(?s)Func.*?EndFunc.*\r 正则只是获取 _ArrayDisplay这个函数的函数体。
用上面的表达式只是奇怪为什么会退出或者不能匹配?
我用的Au3.REHelper是1.0.9.9 (?:(?!EndFunc).)这里在处理较多数据时容易出问题,尽量少用吧~ 试试以下(?si)(?:^|\n)\h*func\h+_ArrayDisplay\h*\(\V+.*?\n\h*EndFunc\b 感谢Afan的解答,谢谢 (?:(?!EndFunc).)这里在处理较多数据时容易出问题,尽量少用吧~ 试试以下
afan 发表于 2015-6-24 22:53 http://www.autoitx.com/images/common/back.gif
A大的回答总能给我很多启示 回复 4# afan
不过最好还是:(?si)(?:^|\r\n)\h*func\h+_ArrayDisplay\h*\(\V+.*?\n\h*EndFunc\b 回复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]