它只是一个简短的问题,因为我无法处理。 我有一个像这样的示例字符串:
$ 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"]}'
因为我想要一个数组,它显示了这两个括号中的确切内容。
答案 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