正则能解决不嵌套的括号内容提取问题
遇到一个问题,就是需要提取字符串中每一个中括号里的内容,在网上搜了一下,发现用正则表达式
(\[[^\]]*\])
可以提取中括号中的内容,以下面文本为匹配对象:
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 "-->" 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个中括号
算法原理
主要思路就是遍历字符串,在中括号的开始和结束位置做标记计数,如果是中括号开始位置对应的结束位置,那么开始位置和结束位置的计数是一致的,这样截取的就是一个完整的中括号的内容。