确定字符频率的功能

时间:2013-04-23 04:27:20

标签: installer nsis

是否有现有的NSIS函数/宏可以告诉我字符串(或字符串)出现在字符串中的次数?

例如:

${StrCount} "abba" "a" $0
# $0 will equal 2 (because the character 'a' occurs twice)

1 个答案:

答案 0 :(得分:1)

你可以尝试这个支持计算单个字符或子字符串以及区分大小写或不敏感的函数:

Function StrCount 
    ;takes the following parameters by the stack:
    ; case sensitive ('s') or insensitive
    ; string to lookup
    ; string where to search

    Exch $2 ;Stack = ($2 test str)
    Exch    ;Stack = (test $2 str)
    Exch $1 ;Stack = ($1 $2 str)
    Exch    ;Stack = ($2 $1 str)
    Exch 2  ;Stack = (str $1 $2)
    Exch $0 ;Stack = ($0 $1 $2)
    Exch 2  ;Stack = ($2 $1 $0) just not to mess order
    Push $3
    Push $4
    Push $5 
    Push $6 ;Stack = ($6 $5 $4 $3 $2 $1 $0)

    StrLen $4 $1    
    StrCpy $5 0
    StrCpy $6 0

    ;now $0=str, $1=test, $2=s/i, $3=tmp str, $4=lookup len, $5=index, $6=count

    loop:
    StrCpy $3 $0 $4 $5
    StrCmp $3 "" end
    ${if} $2 == 's'
        StrCmpS $3 $1 count ignore
    ${else}
        StrCmp $3 $1 count ignore
    ${endif}
    count:
    IntOp $6 $6 + 1 ;count++
    ignore:
    IntOp $5 $5 + 1 ;index++
    goto loop
    end:

    Exch 6  ;Stack = ($0 $5 $4 $3 $2 $1 $6)
    Pop $0
    Pop $5
    Pop $4
    Pop $3
    Pop $2
    Pop $1  ;Stack = ($6)
    Exch $6 ;count is on top stack

FunctionEnd

!macro StrCount str look si
    Push ${str}
    Push ${look}
    Push ${si}
    Call StrCount
!macroend
!define StrCount "!insertmacro StrCount"

这样称呼:

${StrCount} "AbABABa" "Ba" "i" #or 's' for case sensitive
Pop $0
DetailPrint "count=$0"