Jump to content

Regular expression apprecition society.


Recommended Posts

Don't you just love it when a regular expression comes out on top?! I know I do..

Local $hTimer = 0

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_1('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_2('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_1($sDrive)
    Local $aArray = [@HomeDrive, _
            @ProgramFilesDir, _
            @SystemDir, _
            @WindowsDir]
    For $sFilePath In $aArray
        If StringLeft($sFilePath, 1) = $sDrive Then
            Return True
        EndIf
    Next
    Return False
EndFunc   ;==>_IsSystemDrive

Func _IsSystemDrive_Test_2($sDrive)
    Return StringRegExp(@HomeDrive & '|' & @ProgramFilesDir & '|' & @SystemDir & '|' & @WindowsDir, '(?<=^|\|)(?:' & $sDrive & ')') = 1
EndFunc   ;==>_IsSystemDrive

I am no expert at regular expressions, but what I have managed to learn has proved very useful over the last couple of years.

Edited by guinness

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

101 % agree :D

BTW you can save 2 ms more by removing the '=1' which makes your code test twice (1st with the regex, 2nd by interpreting the func return)

Local $hTimer = 0

$hTimer = TimerInit()
For $i = 1 To 10000
    $s = _IsSystemDrive_Test_2('C')
Next
ConsoleWrite($s & @CRLF & TimerDiff($hTimer) & @CRLF)

$hTimer = TimerInit()
For $i = 1 To 10000
    $s = _IsSystemDrive_Test_3('C')
Next
ConsoleWrite($s & @CRLF & TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_2($sDrive)
    Return StringRegExp(@HomeDrive & '|' & @ProgramFilesDir & '|' & @SystemDir & '|' & @WindowsDir, _
        '(?<=^|\|)(?:' & $sDrive & ')') = 1
EndFunc   ;==>_IsSystemDrive

Func _IsSystemDrive_Test_3($sDrive)
    Return StringRegExp(@HomeDrive & '|' & @ProgramFilesDir & '|' & @SystemDir & '|' & @WindowsDir, _
        '(?<=^|\|)(?:' & $sDrive & ')')
EndFunc   ;==>_IsSystemDrive
Link to comment
Share on other sites

I like it better when it does not.

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_3('C:')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_3($sDrive)
    Return StringInStr(@HomeDrive , $sDrive) And StringInStr(@ProgramFilesDir , $sDrive) And StringInStr(@SystemDir , $sDrive) And StringInStr(@WindowsDir , $sDrive)
EndFunc   ;==>_IsSystemDrive
Edited by JohnOne

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Link to comment
Share on other sites

Especially when the tests are fair.

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_4('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_4($sDrive)
    Return StringLeft(@HomeDrive , 1) = $sDrive And StringLeft(@ProgramFilesDir , 1) = $sDrive And StringLeft(@SystemDir , 1) = $sDrive And StringLeft(@WindowsDir , 1) = $sDrive
EndFunc   ;==>_IsSystemDrive

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Link to comment
Share on other sites

I record the 1st function as quicker by approx 10 ms. Interesting what a small change does to alter the result.

Global $hTimer = 0
Global $aArray = [ _
 @HomeDrive, _
 @ProgramFilesDir, _
 @SystemDir, _
 @WindowsDir _
]

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_1('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_2('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_1($sDrive)
    For $sFilePath In $aArray
        If StringLeft($sFilePath, 1) = $sDrive Then
            Return True
        EndIf
    Next
    Return False
EndFunc   ;==>_IsSystemDrive

Func _IsSystemDrive_Test_2($sDrive)
    Return StringRegExp($aArray[0] & '|' & $aArray[1] & '|' & $aArray[2] & '|' & $aArray[3], '(?<=^|\|)(?:' & $sDrive & ')') = 1
EndFunc   ;==>_IsSystemDrive
Link to comment
Share on other sites

Hum :blink:

JO the 2nd code is not faster than the regex, but the 1st one looks like a "learn when not to use regex" (in this particular case)

They both register faster for me.

But you're right, I've been dodging regex since I started AutoIt, I just don't get it, I've tried but it's like an alien language to me.

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Link to comment
Share on other sites

I record the 1st function as quicker by approx 10 ms. Interesting what a small change does to alter the result.

Global $hTimer = 0
Global $aArray = [ _
 @HomeDrive, _
 @ProgramFilesDir, _
 @SystemDir, _
 @WindowsDir _
]

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_1('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_2('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_1($sDrive)
    For $sFilePath In $aArray
        If StringLeft($sFilePath, 1) = $sDrive Then
            Return True
        EndIf
    Next
    Return False
EndFunc   ;==>_IsSystemDrive

Func _IsSystemDrive_Test_2($sDrive)
    Return StringRegExp($aArray[0] & '|' & $aArray[1] & '|' & $aArray[2] & '|' & $aArray[3], '(?<=^|\|)(?:' & $sDrive & ')') = 1
EndFunc   ;==>_IsSystemDrive

Too many Global variables like that makes my head hurt.

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...