Jump to content

Recommended Posts

Posted

This UDF write as probable solution of "Assigned Feature Request" (Ticket #588)

RobSaunders, Valik and MsCreatoR Thanks for discussion

$sString = "This is a Test, a _stringRegExpReplaceEx test"
$sRetVar = _StringRegExpReplaceEx($sString, "\b(\w)(\w*)")
$iRepCnt = @extended

If @error Then
    MsgBox(16, "ERROR", "Err: "& @error &@CRLF& "Ext: "& @extended)
Else
    MsgBox(64, "Results of ", StringFormat("Initial String:\n%s\n\nReturn String:\n%s\n\nSubstrings found: %s", $sString, $sRetVar, $iRepCnt))
EndIf


; =============================================================================
; _StringRegExpReplaceEx($sString, $sPattern [,$sFunction])
; -----------------------------------------------------------------------------
; Replace text in a string based on regular expressions to text,
; returned by custom CallBack function
;
; $sString     : The string to check
; $sPattern    : The regular expression to compare.
; $sFunction   : Callback Function Name
;
; Return Value : Final String
;
; @Error         Meaning
; 0              Check @Extended for the number of replacements performed.
; 2              Pattern invalid. @Extended = offset of error in pattern.
; =============================================================================
Func _StringRegExpReplaceEx($sString, $sPattern, $sFunction = "_StringRegExpReplaceCallBack")
    Local Const $aBlank[10] = ['','','','','','','','','','']
    Local $aM1, $aM2, $sStrip, $aStrip, $aGroups, $sResult = ""

    $sStrip = StringRegExpReplace($sString, $sPattern, Chr(0))
    If @error Then Return SetError(@error, @extended, $sString)
    $aStrip = StringSplit($sStrip, Chr(0))

    $aM1 = StringRegExp($sString, $sPattern, 4)
    If IsArray($aM1) Then
        For $i=0 To UBound($aM1)-1
            $aGroups = $aBlank
            $aM2=$aM1[$i]
            For $j=0 To UBound($aM2)-1
                $aGroups[$j]=$aM2[$j]
            Next
            $sResult &= $aStrip[$i+1]
            $sResult &= Call($sFunction, $aGroups)
        Next
    EndIf

    $sResult &= $aStrip[$aStrip[0]]
    Return SetError(0, UBound($aM1), $sResult)
EndFunc ;==> _StringRegExpReplaceEx

; =============================================================================
; _StringRegExpReplaceCallBack ($aGroups)
; -----------------------------------------------------------------------------
; Custom user function for building replacement string
; base on found string and substrings (capture groups)
;
; $aGroups     : Array of searched substrings
;
;              : $aGroups[0] equal to "\0"
;              : $aGroups[1] equal to "\1"
;              : ...
;
; Return Value : Replacement string
; =============================================================================
Func _StringRegExpReplaceCallBack($aGroups)
    Switch $aGroups[1]
        Case "_"
            Return "_" & StringUpper(StringLeft($aGroups[2], 1)) & StringTrimLeft($aGroups[2], 1)
        Case "t", "T"
            Return StringUpper($aGroups[0])
        Case Else
            Return $aGroups[0]
    EndSwitch
EndFunc ;==> _StringRegExpReplaceCallBack
  • 9 months later...
Posted

  On 10/9/2008 at 8:20 AM, 'amel27 said:

This UDF write as probable solution of "Assigned Feature Request" (Ticket #588)

RobSaunders, Valik and MsCreatoR Thanks for discussion

$sString = "This is a Test, a _stringRegExpReplaceEx test"
$sRetVar = _StringRegExpReplaceEx($sString, "\b(\w)(\w*)")
$iRepCnt = @extended

If @error Then
    MsgBox(16, "ERROR", "Err: "& @error &@CRLF& "Ext: "& @extended)
Else
    MsgBox(64, "Results of ", StringFormat("Initial String:\n%s\n\nReturn String:\n%s\n\nSubstrings found: %s", $sString, $sRetVar, $iRepCnt))
EndIf


; =============================================================================
; _StringRegExpReplaceEx($sString, $sPattern [,$sFunction])
; -----------------------------------------------------------------------------
; Replace text in a string based on regular expressions to text,
; returned by custom CallBack function
;
; $sString     : The string to check
; $sPattern    : The regular expression to compare.
; $sFunction   : Callback Function Name
;
; Return Value : Final String
;
; @Error         Meaning
; 0              Check @Extended for the number of replacements performed.
; 2              Pattern invalid. @Extended = offset of error in pattern.
; =============================================================================
Func _StringRegExpReplaceEx($sString, $sPattern, $sFunction = "_StringRegExpReplaceCallBack")
    Local Const $aBlank[10] = ['','','','','','','','','','']
    Local $aM1, $aM2, $sStrip, $aStrip, $aGroups, $sResult = ""

    $sStrip = StringRegExpReplace($sString, $sPattern, Chr(0))
    If @error Then Return SetError(@error, @extended, $sString)
    $aStrip = StringSplit($sStrip, Chr(0))

    $aM1 = StringRegExp($sString, $sPattern, 4)
    If IsArray($aM1) Then
        For $i=0 To UBound($aM1)-1
            $aGroups = $aBlank
            $aM2=$aM1[$i]
            For $j=0 To UBound($aM2)-1
                $aGroups[$j]=$aM2[$j]
            Next
            $sResult &= $aStrip[$i+1]
            $sResult &= Call($sFunction, $aGroups)
        Next
    EndIf

    $sResult &= $aStrip[$aStrip[0]]
    Return SetError(0, UBound($aM1), $sResult)
EndFunc ;==> _StringRegExpReplaceEx

; =============================================================================
; _StringRegExpReplaceCallBack ($aGroups)
; -----------------------------------------------------------------------------
; Custom user function for building replacement string
; base on found string and substrings (capture groups)
;
; $aGroups     : Array of searched substrings
;
;              : $aGroups[0] equal to "\0"
;              : $aGroups[1] equal to "\1"
;              : ...
;
; Return Value : Replacement string
; =============================================================================
Func _StringRegExpReplaceCallBack($aGroups)
    Switch $aGroups[1]
        Case "_"
            Return "_" & StringUpper(StringLeft($aGroups[2], 1)) & StringTrimLeft($aGroups[2], 1)
        Case "t", "T"
            Return StringUpper($aGroups[0])
        Case Else
            Return $aGroups[0]
    EndSwitch
EndFunc ;==> _StringRegExpReplaceCallBack

This example returns the same results as the script from post #1.

;
; Returns the same result as the example script,post #1, at
; http://www.autoitscript.com/forum/index.php?showtopic=82292&view=findpost&p=589332
Local $sString = "This is a Test, a _stringRegExpReplace test"

Local $sRetVar = StringRegExpReplace($sString, "\b(\w)(\w*)(, | |\z)", 'Call("_CallFunction","\1","\2","\3") & ')
Local $iRepCnt = @extended
;ConsoleWrite($sRetVar & @CRLF)

$sRetVar = Execute(StringTrimRight($sRetVar, 3))

MsgBox(64, "Results of ", StringFormat("Initial String:\n%s\n\nReturn String:\n%s\n\nSubstrings found: %s", _
        $sString, $sRetVar, $iRepCnt / 3)); 3 back-references used in regular expression replace parameter.


Func _CallFunction($a, $b, $c)
    If StringLen($b) > 1 And $a <> "_" Then
        $a = StringUpper($a)
        $b = StringUpper($b)
    EndIf
    Return $a & $b & $c
EndFunc   ;==>_CallFunction
;
Posted

you don't need to use call when using execute

;
; Returns the same result as the example script,post #1, at
; http://www.autoitscript.com/forum/index.php?showtopic=82292&view=findpost&p=589332
Local $sString = "This is a Test, a _stringRegExpReplace test"

Local $sRetVar = StringRegExpReplace($sString, "\b(\w)(\w*)(, | |\z)", '_CallFunction("\1","\2","\3") & ');removed call because it's useless
Local $iRepCnt = @extended
;ConsoleWrite($sRetVar & @CRLF)

$sRetVar = Execute(StringTrimRight($sRetVar, 3))

MsgBox(64, "Results of ", StringFormat("Initial String:\n%s\n\nReturn String:\n%s\n\nSubstrings found: %s", _
        $sString, $sRetVar, $iRepCnt / 3)); 3 back-references used in regular expression replace parameter.


Func _CallFunction($a, $b, $c)
    If StringLen($b) > 1 And $a <> "_" Then
        $a = StringUpper($a)
        $b = StringUpper($b)
    EndIf
    Return $a & $b & $c
EndFunc   ;==>_CallFunction
;

Only two things are infinite, the universe and human stupidity, and i'm not sure about the former -Alber EinsteinPractice makes perfect! but nobody's perfect so why practice at all?http://forum.ambrozie.ro

Posted

  On 7/20/2009 at 3:44 PM, 'Xand3r said:

you don't need to use call when using execute

Xand3r

Thanks for the heads up. It is appreciated.

Malkey

Still intrigued by the possibilities, here is another example.

It creates a 2D array of all words per line.

;
; This example returns a 2D array. Rows are each line. The columns are each word in that line.
; StringRegExpReplace() returns each line into a StringRegExp() which returns an array as a parameter of the function, Test1.
; The RE pattern of StringRegExp can be modified to select specific data from each line to fill the array, not just each word.
#include <array.au3>

Global $aMain[3][7], $iRow = 0

Local $sStr = "Jack and Jill went up the hill." & @LF & _
        "The second line of the string $sStr" & @CRLF & _
        "And a third line of a string"

Execute(StringTrimRight(StringRegExpReplace($sStr, "(.*)(\v+|$)", 'Test1(StringRegExp("\1","\\b(\\w+)",3)) & '), 2))

_ArrayDisplay($aMain, "Results")

Func Test1($aArr)
    For $x = 0 To UBound($aArr) - 1
        $aMain[$iRow][$x] = $aArr[$x]
    Next
    $iRow += 1
    Return
EndFunc   ;==>Test1
;

I imagine, if/when this Feature Request is implemented, a script similar to this example would work without the use of the Execute command.

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...