提取括号中的内容

正则能解决不嵌套的括号内容提取问题

遇到一个问题,就是需要提取字符串中每一个中括号里的内容,在网上搜了一下,发现用正则表达式

(\[[^\]]*\])

可以提取中括号中的内容,以下面文本为匹配对象:

PerformanceManager[第1个中括号]Product[第2个中括号]<[第3个中括号]79~

匹配结果为:

0-->第1个中括号
1-->第2个中括号
2-->第3个中括号

(可以用工具测试下,网址:http://tools.jb51.net/regex/javascript )

提取括号中的内容_第1张图片

带嵌套括号的文本处理

难度升级:如果中括号中还包含中括号,正则表达式就失去作用了,不得不另想办法,自己动手,丰衣足食。

AutoHotkey代码如下:

msg := "PerformanceManager[第1个中括号]Product[第2个中括号[中括号中包含中括号]]<[第3个中括号]79~"

for k,v in ExtractMessage(msg)
  MsgBox % k "-->" v

return

  /**
   * 提取中括号中内容,忽略中括号中的中括号
   * @param msg
   * @return
   */    
ExtractMessage(_msg) {
    list := []
    start := 1
    startFlag := 0
    endFlag := 0
    msg:=StrSplit(_msg)
    ; OutputDebug % obj2str(msg)
    loop % msg.length()
    {
      i:=A_Index
      if (msg[i] = "[") {
        startFlag+=1
        OutputDebug % "startFlag =" startFlag
        if (startFlag = endFlag + 1) {
          start := i
          
          OutputDebug % "start=" start
        }
      } else if (msg[i] = "]") {
        endFlag+=1
        OutputDebug % "endFlag =" endFlag
        if (endFlag = startFlag) {
          OutputDebug % "endFlag=" endFlag
          list.Insert(SubStr(_msg,start + 1, i-start-1))
        }
      }
      
    }
    return list
  }

输出结果如下:

0-->第1个中括号
1-->第2个中括号[中括号中包含中括号]
2-->第3个中括号

算法原理

主要思路就是遍历字符串,在中括号的开始和结束位置做标记计数,如果是中括号开始位置对应的结束位置,那么开始位置和结束位置的计数是一致的,这样截取的就是一个完整的中括号的内容。

你可能感兴趣的:(AutoHotkey,正则表达式)