StringRegExp模式|获取括号内的文本

StringRegExp模式|获取括号内的文本,regex,autoit,Regex,Autoit,这只是一个简短的问题,因为我无法回答。 我有这样一个字符串示例: $String='[{test:[“0”,“xx”],test2:[“11”,“23”}]' 我想做的是编写函数,它会给我括号中的文本。它应该将其写入数组 我试图编写的函数如下所示: $avArray=getStringInsideBracketsKW($String,'[',']')) 那么现在,这个函数的作用是什么呢? 我不擅长RegExp模式,但我确信这是实现我想要的最好的方法 @编辑 因为它在AutoIt中,所以必须是这样

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

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

我想做的是编写函数,它会给我括号中的文本。它应该将其写入数组

我试图编写的函数如下所示:

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

那么现在,这个函数的作用是什么呢? 我不擅长RegExp模式,但我确信这是实现我想要的最好的方法

@编辑

因为它在AutoIt中,所以必须是这样的smth:

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

这将使我:

$NewAvArray[0]='[{测试:[“0”,“xx”]'

$NewAvArray[1]=“11,23”]

但我想要的结果是:

$NewAvArray[0] = '{test:["0","xx"],test2:["11","23"]}'
因为我想要一个数组,它显示这两个括号中的确切内容。

试试这个

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

这对你有用吗

#include <Array.au3>


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


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


_ArrayDisplay($Aarray)
#包括
$sString=“鲍勃·帕克[B[dd]P]”和@CRLF&“弗雷德·布洛格斯[FB]”
$aArray=StringRegExp($sString,[\(\[])(.*[/)\]],3)
_ArrayDisplay($Aarray)

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

Regex确实不适合这种文本操作,为什么不编写一个函数来手动操作呢?它可能会稍微慢一点,但你可以确定它做的是正确的。这一次花了我10分钟的时间,并且可能会因为不需要重拨两个不同的数组而变得更快。需要一个
$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
#包括
本地$sTest=“H[e[l]l]o[W[o[r]ld]!”
本地$aRet=_stringbetweenower($sTest,“[”,“]”)之间的字符串
_阵列显示($aRet)
Func\u StringBetweenOuter($sString、$ssstart、$sEnd)
本地$aRet[1]=[0]
如果$sStart=$sEnd,则返回SetError(1,0,0);Start=End
本地$IPO=1、$INTETSTART、$INTENDER、$aStack[1]=[0]、$iStart
而1
$INQUETSTART=StringInStr($sString,$SSSTART,0,1,$IPO)
$iNextEnd=StringInStr($sString,$sEnd,0,1,$ipo)
如果$iNextEnd=0,则ExitLoop
如果$iNextEnd<$INEXETSTART或$INEXETSTART=0,则
如果$aStack[0]<1,则
返回SetError(2,$iNextEnd,0);开始和结束不平衡
恩迪夫
$iStart=\u阵列操作($aStack)
$aStack[0]-=1
如果$aStack[0]=0,则
_ArrayAdd($aRet,StringMid($sString,$iStart,$iNextEnd-$iStart))
$aRet[0]+=1
恩迪夫
$IPO=$iNextEnd+1
其他的
_ArrayAdd($aStack,$infortstart+1)
$aStack[0]+=1
$iPos=$iNextStart+1
恩迪夫
温德
返回$aRet
EndFunc;==>\u字符串在中间

请添加更多细节,使您的答案对读者更有用。在AutoIt中不可能这样做smth。我指的是这种构造。我已经检查过它是否找到这样的模式:
$NewAvArray=StringRegExp($string,'/\'&$openBracket&'.'.\'&$closeBracket&'/g')
而且找不到元素;/n您在混合您的期望值。第一个示例:在第一个和最后一个括号之间获取所有值。但是,您提到[x[aa]][a[]]这应该以不同的方式处理。为什么不直接使用_StringBetween?因为它会找到第一个“[”和最近的“]之间的字符串“。我想找到该列表的容器。因此,当它类似于[x[aa]t]时,我希望得到一个结果x[aa]t。当字符串类似于“[x[aa]][a[]]”时,我希望在结果处得到一个带有$avArray[0]=x[aa]和$avArray[1]=a[]你为什么不从头开始写呢?找到所有$a的所有$b并提取外部的。我的StringRegExp示例按照你的要求运行。你是rignt。RegExp在这里没有用处。我编写了一种像你一样的函数。但是它太慢了。希望你能快一点:)谢谢!
#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