匹配括号( ( ),{ },[ ]等左右对应的字符 ) 的一种方法
来源:互联网 发布:酷方 知乎 编辑:程序博客网 时间:2024/06/11 02:09
前两天写那个异步函数顺序执行的过程中,动态修改函数,遇到setTimeout,我需要提取执行的时间,形如:
setTimeout(function() { output.innerText += '第三个异步函数,延迟1秒执行\n'; }, 1000);
要截取1000
这个值。经过分析,我发现setTimeout()这个函数闭合的圆括号)
与前一个逗号,
之间的内容,就是要截取的值。
代码
想了想,要确定闭合括号)
的位置,需要和开始位置(setTimeout
之后)的括号(
匹配。看了些文档后,写了下面的方法:
function match(str, startStr, item) { var counter = 0, end = -1, matchLeft = item.charAt(0), matchRight = item.charAt(1), start = str.indexOf(startStr) + startStr.length; search(start + 1); function search(position) { end = str.indexOf(matchRight, position); if (end != -1) { counter++; var subStr = str.substring(start + 1, end).match(eval("/\\" + matchLeft + "/g")); if (subStr !== null) { var numsOfMatchLeft = subStr.length; } else if (subStr === null) { return; } if (counter > numsOfMatchLeft) { return; } else { arguments.callee(end + 1); } } else { console.warn('输入的配对符号有误'); } } return [start, end];}
参数
match函数接收3个参数,str
是要匹配的文本,startStr
是需匹配字符,在文本中的具体位置,为了保证唯一性,一般要带入字符左侧若干文本,item
是要匹配的符号,按左右顺序写全两个,如'()','{}'
等。匹配最上面的setTimeout那个例子,可以这样调用。
var text = 'setTimeout(function() {\ output.innerText += \'第三个异步函数,延迟1秒执行\n\';\ }, 1000);' match(text,'setTimeout(','()');//返回符号的开始,结束位置数组//[11, 71]
实现思路
左右匹配,只要把中间所有的匹配项找到即可。
以 ()
为例,首先从欲匹配符号(
位置的右侧开始寻找)
,设定一个累加计数器,用来记录)
的数量,如果找到,记下)
的位置,计数器自增。
并且在(
的位置与)
的位置间,查找(
的数量,与计数器进行比较。如果计数器的值小于(
的数量,说明该)
不是最终的与最开头的(
相匹配的括号。如果计数器的值等于(
的数量,说明所有()
已经一一对应,下一个)
就是最终的匹配括号。
重复上面的步骤,最终得到括号的位置。
这种方法不局限于括号,理论上可义匹配不相同的任意两项,也不局限于长度为1的字符,对位置稍加修改即可。
0 0
- 匹配括号( ( ),{ },[ ]等左右对应的字符 ) 的一种方法
- 左右括号是否匹配用的栈
- 括号的匹配方法
- 括号匹配的方法
- Generate Parentheses 递归求括号的左右匹配
- #TeX括号#将一种格式的括号变为有左右双引号的区分(白皮书字符串)
- 实现一种算法,打印n对括号的全部有效组合(即左右括号正确配对)
- 判断括号的匹配性的一种算法
- 输出n对括号的所有有效(左右括号成对匹配)排列
- 针对同一种类型的括号匹配问题
- 括号匹配算法的一种正确实现(java)
- 查找对应的括号
- 括号的匹配,顺序栈方法
- Vim输入左括号时自动匹配输入对应的右括号
- oracle左右连接的另外表示方法-括号加号
- oracle左右连接的另一种显示方法—括号加号
- 括号匹配的检验
- 括号的匹配检验
- dp46上 HDU2084
- Oracle数据库使用PDE文件导出数据和传统EXP/IMP方式的区别
- java中匿名对象的使用
- 使用MediaPlayer获取Http网络流时MediaPlayer的状态调用
- [并查集 杂题] BZOJ 4452 [Cerc2015]Export Estimate
- 匹配括号( ( ),{ },[ ]等左右对应的字符 ) 的一种方法
- 2017上半年课程设计1
- 数据库学习
- [编程题]数独(JAVA)
- python常用函数
- 关于VUE-CLI脚手架热更新不起效的原因
- Android6.0运行时权限
- Javascript——DOM模型解析
- Swift三元运算符和Nil Coalescing运算符