StringRegExp模式|在括号内获取文字

时间:2014-06-01 01:49:13

标签: regex autoit

它只是一个简短的问题,因为我无法处理。 我有一个像这样的示例字符串:

  

$ String =' [{test:[" 0"," xx"],test2:[" 11"," 23"]}]'

我想要做的是编写函数,它会在括号中给出文本。它应该写入Array。

我想写的功能看起来像那样:

  

$ avArray = getStringInsideBracketsKW($ String,' [',']')

func getStringInsideBracketsKW($string, $openBracket, $closeBracket)

    $NewAvArray = StringRegExp($string,'/\'&$openBracket&'.*?\'&$closeBracket&'/g')

    Return $NewAvArray 


EndFunc

所以现在 - 具有此功能的wron是什么? 我不擅长RegExp模式,但我相信这是做我想做的最好的方法。

@EDIT

因为它在AutoIt中,所以必须像那样:

  

$ NewAvArray = StringRegExp($ string,' [。*?]',3)

这将导致我:

  

$ NewAvArray [0] =' [{test:[" 0"," xx"]' ;

     

$ NewAvArray [1] =' [" 11," 23"]';

但我想得到一个结果:

$NewAvArray[0] = '{test:["0","xx"],test2:["11","23"]}'

因为我想要一个数组,它显示了这两个括号中的确切内容。

3 个答案:

答案 0 :(得分:1)

这对你有用吗?

#include <Array.au3>


$sString = "Bob Parker [B[dd]P]" & @CRLF & "Fred Bloggs [FB]"


$aArray = StringRegExp($sString, "[\(\[](.*)[/)\]]", 3)


_ArrayDisplay($Aarray)

答案 1 :(得分:0)

试试这个

    $NewAvArray = BinaryToString(string("$string,'/\'&$openBracket&'.*?  \'&$closeBracket&'/g'))
    $aRes=_StringBetween($Source,"[","]")
    _ArrayDisplay($aRes)

答案 2 :(得分:0)

这不能用常规语言完成,因为没有有限数量的状态(理论上有无限数量的嵌套括号)。我听说过一些正则表达式扩展添加了对嵌套匹配的支持,但我不知道AutoIt中有类似的东西。

正则表达式真的不适合这种文本操作,为什么不只是编写一个函数来手动执行呢?它可能会慢一点,但你可以肯定它做得对。这个花了我10分钟,并且可以通过消除重新调整2个不同阵列的需要来加快速度。对$aStack变量的需求说明了为什么您不能使用传统正则表达式。

#include <Array.au3>

Local $sTest = "H[e[l]l]o [W[o[r]ld]]!"
Local $aRet = _StringBetweenOuter($sTest, "[", "]")

_ArrayDisplay($aRet)

Func _StringBetweenOuter($sString, $sStart, $sEnd)
    Local $aRet[1] = [0]

    If $sStart = $sEnd Then Return SetError(1, 0, 0) ; Start = End

    Local $iPos = 1, $iNextStart, $iNextEnd, $aStack[1] = [0], $iStart
    While 1
        $iNextStart = StringInStr($sString, $sStart, 0, 1, $iPos)
        $iNextEnd = StringInStr($sString, $sEnd, 0, 1, $iPos)

        If $iNextEnd = 0 Then ExitLoop

        If $iNextEnd < $iNextStart Or $iNextStart = 0 Then
            If $aStack[0] < 1 Then
                Return SetError(2, $iNextEnd, 0) ; Unbalanced starts and ends
            EndIf

            $iStart = _ArrayPop($aStack)
            $aStack[0] -= 1

            If $aStack[0] = 0 Then
                _ArrayAdd($aRet, StringMid($sString, $iStart, $iNextEnd - $iStart))
                $aRet[0] += 1
            EndIf

            $iPos = $iNextEnd + 1
        Else
            _ArrayAdd($aStack, $iNextStart + 1)
            $aStack[0] += 1

            $iPos = $iNextStart + 1
        EndIf
    WEnd

    Return $aRet
EndFunc   ;==>_StringBetweenOuter