Redraw = false//禁止重绘(类似于VBA中的: Application.screenupdating=FALSE),以提高运行效率 //去除所有空行和只由空白字符构成的行 document.selection.replace("^\\s*?\\n|\\r\\n$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF ) //下面是Plan A function planA(n){ //去除所有不是由数字或\t开头的非空行 document.selection.replace("\\r\\n^[^\\d\\t].*?$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF ) //以下是核心代码,我把它们写进了一个块中,会根据实际情况自动生成具体的解决方案 { var find = "^([^\\t\\r]+)",replace = "$1",str = ""//初始化一些变量 //如下是1个迭代的过程并包括下面的拼接,我把它们写进了一个块中,是核心代码中的关键代码 { for(var i=1;i<=n;i++){ str = str+"\\t([^\\t\\r]*)" replace = replace+"\\t$"+(i+1)+"$"+(n+i+1) } find = find+str+"\\r\\n"+str+"$" } document.selection.Replace(find, replace, eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF ) } } //下面是Plan B function planB(n){ //去除所有不是由数字或\t开头的非空行 document.selection.replace("\\r\\n^[^\\d\\t].*?$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF ) lines = document.getLines()//获取此时文档中的行数 if(lines-1){//如果行数>1,则进行进一步处理 document.selection.startOfDocument()//光标移动到文档开头 document.selection.lineDown(0,1)//光标向下移动1行 //如下是1个迭代的过程,是核心代码 for(var lineNo=2;lineNo<=lines;){ document.selection.charRight(1,1)//光标向右移动1个字符并选中之间的部分 if(document.selection.text=="\t"){//如果选中的是\t,则进行进一步处理 //获取相邻的2行中的文本,分别传递给2个变量 var str1=document.getLine(lineNo-1)+"\t\t" var str2=document.getLine(lineNo)+"\t\t" //创建2个正则表达式对象 var reg1 = editor.regex var reg2 = editor.regex //定义这2个正则表达式 reg1.Global = true reg1.Pattern = "([^\t]*)\t" reg2.Global = true reg2.Pattern = "([^\t]*)\t" //声明并初始化strr1和strr2 var strr1 = reg1.Find(str1).Item(1).Value,strr2 = reg2.Find(str2).Item(1).Value var str = ""//初始化str ///如下是1个迭代的过程,是核心代码中的关键代码 for(var i = 0;i<=n;i++){ if(i>0){ str+="\t" } str=str+strr1+strr2 strr1 = reg1.Find(str1).Item(1).Value strr2 = reg2.Find(str2).Item(1).Value } document.selection.endOfLine()//光标移动到当前行尾 document.selection.startOfLine(1)//光标移动到当前行首,并选中之间部分 document.selection.lineUp(1,1)//光标向上移动1行,并选中之间部分 document.write(str)//把str写入文档以替换当前选中部分 document.selection.charRight(0,1)//光标向右移动1个字符 lines--//因为以上处理会使文档减少1行,所以lines=lines-1 }else{ document.selection.charLeft(0,1)//光标向左移动1个字符 document.selection.lineDown(0,1)//向下移动光标一定的行数 lineNo++ } } } } //使用try{}catch(err){},如果捕获错误,则弹出对话框并终止宏 try{//尝试获取第2行,如果没有第2行,就会抛出错误 document.GetLine(2) } catch(err){//发生错误时将其捕获,并进行进一步处理 alert("其实你并没有必要再做多余的处理") quit()//终止执行宏 } var n = document.getLine(2).match(/\t/g)//分析str中\t的情况 if(n){//如果n!=null,则进行进一步处理 n = n.length//获取当前第2行的\t数目并赋值给n if(n<5){ planA(n) }else{ answer = confirm(//在特殊情况下,弹出对话框让用户自行决定是否选择替换方案 "目前貌似有"+(n+1)+"列,但是如果表格的列数>=6,\ Plan A就不能正确处理,因为EmEditor的正则表达式\ 引擎最多只支持9个分组和10组反向引用,"+(n+1)+"列\ 就需要"+(2*n+1)+"个分组。不过我有一个PlanB,或许\ 能得到正确的处理结果,请问是否要选用Plan B?") if(answer ){//如果用户选择了是,则进行进一步处理 planB(n) }else{//否则终止执行宏 quit() } } }else{//如果n==null alert("我认为这个宏不足以解决问题") } Redraw = true//允许重绘
序号为首列的表格排版(实现1-基于EmEditor的正则表达式引擎)
Redraw = false//禁止重绘(类似于VBA中的: Application.screenupdating=FALSE),以提高运行效率 //去除所有空行和只由空白字符构成的行 document.selection.replace("^\\s*?\\n|\\r\\n$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF ) lines = document.getLines()//获取此时文档中的行数 if(lines==1){//如果只有1行,则不需要进行处理 alert("其实你并没有必要再做多余的处理") }else{//如果行数>1,则进行进一步处理 //由于第1行可能是某些描述性文字,所以分析第2行,并进行一些判断和选择 if(document.getLine(2).indexOf("\t")>-1){//如果存在\t //去除所有不是由数字或\t开头的非空行 document.selection.replace("\\r\\n^[^\\d\\t].*?$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF ) lines = document.getLines()//获取此时文档中的行数 if(lines-1){//如果行数>1,则进行进一步处理 document.selection.startOfDocument()//光标移动到文档开头 document.selection.lineDown(0,1)//光标向下移动1行 //如下是1个迭代的过程,是核心代码 for(var lineNo=2;lineNo<=lines;){ document.selection.charRight(1,1)//光标向右移动1个字符并选中之间的部分 if(document.selection.text=="\t"){//如果选中的是\t,则进行进一步处理 //获取相邻的2行中的文本,并用\t进行分组,把得到的2个数组分别传递给2个变量 str1=document.getLine(lineNo-1).split("\t") str2=document.getLine(lineNo).split("\t") document.selection.selectLine()//选中光标所在行 document.selection.Delete()//删除选中的这一行,所有下面的行(如果有的话)上移1行 document.selection.lineUp(0,1)//光标向上移动1行 document.selection.selectLine()//选中光标所在行 document.selection.Delete()//删除选中的这一行,所有下面的行(如果有的话)上移1行 document.selection.lineOpen(true)//在光标所在行和上一行之间插入1个空白行,并把光标移过去 ///如下是1个迭代的过程,是核心代码中的关键代码 for(var i=0,n=str1.length;i<n;i++){ if(i){ document.write("\t") } document.write(str1[i]+str2[i]) } document.selection.charRight(0,1)//光标向右移动1个字符 lines--//因为以上处理会使文档减少1行,所以lines=lines-1 }else{ document.selection.charLeft(0,1)//光标向左移动1个字符 document.selection.lineDown(0,1)//向下移动光标一定的行数 lineNo++ } } } }else{//tabs==null时的提示信息 alert("我认为这个宏不足以解决问题") } } Redraw = true//允许重绘
序号为首列的表格排版(实现2-基于JavaScript的split()方法)
Redraw = false//禁止重绘(类似于VBA中的: Application.screenupdating=FALSE),以提高运行效率 //去除所有空行和只由空白字符构成的行 document.selection.replace("^\\s*?\\n|\\r\\n$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF ) lines = document.getLines()//获取此时文档中的行数 if(lines==1){//如果只有1行,则不需要进行处理 alert("其实你并没有必要再做多余的处理") }else{//如果行数>1,则进行进一步处理 //由于第1行可能是某些描述性文字,所以分析第2行,并进行一些判断和选择 if(document.getLine(2).indexOf("\t")>-1){//如果存在\t //去除所有不是由数字或\t开头的非空行 document.selection.replace("\\r\\n^[^\\d\\t].*?$", "", eeReplaceAll | eeFindReplaceRegExp,eeExFindSeparateCRLF ) lines = document.getLines()//获取此时文档中的行数 if(lines-1){//如果行数>1,则进行进一步处理 document.selection.startOfDocument()//光标移动到文档开头 document.selection.lineDown(0,1)//光标向下移动1行 //如下是1个迭代的过程,是核心代码 for(var lineNo=2;lineNo<=lines;){ document.selection.charRight(1,1)//光标向右移动1个字符并选中之间的部分 if(document.selection.text=="\t"){//如果选中的是\t,则进行进一步处理 //获取相邻的2行中的文本,分别传递给2个变量 var str1=document.getLine(lineNo-1) var str2=document.getLine(lineNo) //创建2个正则表达式对象 var reg1 = /[^\t]*/g, reg2 = /[^\t]*/g //声明并初始化strr1和strr2 var strr1 = reg1.exec(str1),strr2 = reg2.exec(str2) var str = ""//初始化str ///如下是1个迭代的过程,是核心代码中的关键代码 for(var i = 0;strr1!=null;i++){ if(i>0){ str+="\t" } str=str+strr1+strr2 if(strr1!=""){ reg1.exec(str1) } if(strr2!=""){ reg2.exec(str2) } strr1 = reg1.exec(str1) strr2 = reg2.exec(str2) } document.selection.endOfLine()//光标移动到当前行尾 document.selection.startOfLine(1)//光标移动到当前行首,并选中之间部分 document.selection.lineUp(1,1)//光标向上移动1行,并选中之间部分 document.write(str)//把str写入文档以替换当前选中部分 document.selection.charRight(0,1)//光标向右移动1个字符 lines--//因为以上处理会使文档减少1行,所以lines=lines-1 }else{ document.selection.charLeft(0,1)//光标向左移动1个字符 document.selection.lineDown(0,1)//向下移动光标一定的行数 lineNo++ } } } }else{//如果不存在\t alert("我认为这个宏不足以解决问题") } } Redraw = true//允许重绘
序号为首列的表格排版(实现3-基于JavaScript的exec()方法)