【问题标题】:StringRegExp pattern | Get text inside bracketsStringRegExp 模式 |获取括号内的文本
【发布时间】:2014-07-21 11:32:40
【问题描述】:

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

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

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

我要写的函数是这样的:

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

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

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

    Return $NewAvArray 


EndFunc

那么现在 - 这个函数有什么问题? 我不擅长 RegExp 模式,但我确信这是做我想做的最好的方法。

@EDIT

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

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

这会导致我:

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

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

但我想要这样的结果:

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

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

【问题讨论】:

  • 为什么不直接使用 _StringBetween ?
  • 因为它会找到第一个 '[' 和最近的 ']' 之间的字符串。我想找到该列表的容器。所以当它像 [x[aa]t] 时,我想要一个结果 x[aa]t。当字符串像 '[x[aa]][a[]]' 我想要一个具有 $avArray[0] = x[aa] 和 $avArray[1] = a[]的数组>
  • 你为什么不从头开始写呢?为所有 $a 查找所有 $b 并提取外部的。
  • 我的 StringRegExp 示例运行正常。

标签: regex autoit


【解决方案1】:

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

Regex 确实不适合这种文本操作,为什么不直接编写一个函数来手动完成呢?它可能会慢一点,但你可以确定它做的是正确的事情。这个花了我 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

【讨论】:

  • 你是正确的。 RegExp 在这里没有用。我写了一种像你一样的函数。但它太慢了。愿你的速度快一点:) 谢谢!
【解决方案2】:

这对你有用吗?

#include <Array.au3>


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


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


_ArrayDisplay($Aarray)

【讨论】:

    【解决方案3】:

    试试这个

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

    【讨论】:

    • 请添加更多详细信息,以使您的答案对读者更有用。
    • 在 AutoIt 中是不可能做到这样的事情的。我是说那个建筑。我检查了它是否找到这样的模式:$NewAvArray = StringRegExp($string,'/\'&amp;$openBracket&amp;'.*? \'&amp;$closeBracket&amp;'/g') 并且没有找到元素;/
    • 你混合了你的期望。第一个示例:获取第一个和最后一个括号之间的所有内容。但是,您提到 [x[aa]][a[]] 这应该以不同的方式处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2022-12-08
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多