市委网站建设百度应用下载
正则能解决不嵌套的括号内容提取问题
遇到一个问题,就是需要提取字符串中每一个中括号里的内容,在网上搜了一下,发现用正则表达式
(\[[^\]]*\])
可以提取中括号中的内容,以下面文本为匹配对象:
PerformanceManager[第1个中括号]Product[第2个中括号]<[第3个中括号]79~
匹配结果为:
0-->第1个中括号
1-->第2个中括号
2-->第3个中括号
(可以用工具测试下,网址:http://tools.jb51.net/regex/javascript )

带嵌套括号的文本处理
难度升级:如果中括号中还包含中括号,正则表达式就失去作用了,不得不另想办法,自己动手,丰衣足食。
AutoHotkey代码如下:
msg := "PerformanceManager[第1个中括号]Product[第2个中括号[中括号中包含中括号]]<[第3个中括号]79~"for k,v in ExtractMessage(msg)MsgBox % k "-->" vreturn/*** 提取中括号中内容,忽略中括号中的中括号* @param msg* @return*/
ExtractMessage(_msg) {list := []start := 1startFlag := 0endFlag := 0msg:=StrSplit(_msg); OutputDebug % obj2str(msg)loop % msg.length(){i:=A_Indexif (msg[i] = "[") {startFlag+=1OutputDebug % "startFlag =" startFlagif (startFlag = endFlag + 1) {start := iOutputDebug % "start=" start}} else if (msg[i] = "]") {endFlag+=1OutputDebug % "endFlag =" endFlagif (endFlag = startFlag) {OutputDebug % "endFlag=" endFlaglist.Insert(SubStr(_msg,start + 1, i-start-1))}}}return list}
输出结果如下:
0-->第1个中括号
1-->第2个中括号[中括号中包含中括号]
2-->第3个中括号
算法原理
主要思路就是遍历字符串,在中括号的开始和结束位置做标记计数,如果是中括号开始位置对应的结束位置,那么开始位置和结束位置的计数是一致的,这样截取的就是一个完整的中括号的内容。