如何重新编码现有的文本过滤器以进行正则表达式搜索和替换?

时间:2013-03-13 23:43:26

标签: regex text vbscript replace

我能够拼凑下面的代码,以便它执行多个搜索并将函数替换为文本过滤器。该代码适用于EditPlus文本编辑器程序。

除了正则表达式搜索和替换之外,我想执行相同的想法。

在文本过滤器中对多个正则表达式搜索和替换进行编码的正确方法是什么?

enter code here

Option Explicit

Dim oWS, oFS

Set oWS = WScript.CreateObject("WScript.Shell")
Set oFS = WScript.CreateObject("Scripting.FileSystemObject")

'----------
' Script Setup
'----------
Dim oInStream, oOutStream, sInFile, sOutFile, nTotalLines, sArg

'----------
' Process File(s)
'----------
If Wscript.Arguments.Count = 0 Then
If InStr(LCase(WScript.FullName), "cscript.exe") <> 0 Then
sInFile = "StdIn"
sOutFile = "StdOut"
Set oInStream = WScript.StdIn
Set oOutStream = WScript.StdOut
Call ProcessFile()
Else
Call HelpMsg()
End If
Else
For sArg = 0 To Wscript.Arguments.Count -1
sInFile = Wscript.Arguments(sArg)
If IsFile(sInFile) Then
sOutFile = Left(sInFile, InStrRev(sInFile, ".") - 1) & ".lst"
Set oOutStream = oFS.OpenTextFile(sOutFile, 2, True, 0)
Set oInStream = oFS.OpenTextFile(sInFile, 1)
Call ProcessFile()
oWS.Run "NotePad.exe " & sOutFile
Else
Wscript.Echo "File Not Found: " & sInFile, , "Error"
End If
Next
End If

Call CleanUp(0)

'---------------------
' Subroutines
' ********************

'---------------------
Sub CleanUp(exitCode)
Set oInStream = Nothing
Set oOutStream = Nothing
Set oWS = Nothing
Set oWS = Nothing
WScript.Quit(exitCode)
End Sub

'---------------------
Sub ProcessFile()
'oOutStream.WriteLine "<DIV class='mesa'>"
nTotalLines = SeaRep()
'oOutStream.WriteLine "</DIV>"
End Sub

'---------------------

'---------------------
' Functions
' ********************
'---------------------
Function SeaRep()
Dim nLine, sLine, nCount, outPut1, outPut2, outPut3
nCount = 0
Do Until oInStream.AtEndOfStream
nLine = oInStream.Line
sLine = oInStream.ReadLine

outPut1 = Replace(sLine,"1a","foo")
outPut2 = Replace(outPut1,"2b","foobar")
outPut3 = Replace(outPut2,"3c","foosod")
oOutStream.WriteLine (Replace(outPut3,"4d","fooyard"))

nCount = nCount + 1
Loop
AddLineNum = nCount
End Function


'---------------------
'---------------------
Function IsFile (fName)
If oFS.FileExists(fName) Then IsFile = True Else IsFile = False
End Function

' ********************

' End code

2 个答案:

答案 0 :(得分:1)

替换正则表达式与“正常”替换没有什么不同。您只需准备正则表达式的其他步骤:

Set re = New RegExp
re.Pattern    = "1a"
re.IgnoreCase = True
re.Global     = True

实际替换是这样完成的(没有搜索文本,因为该信息包含在正则表达式中):

outPut1 = re.Replace(sLine, "foo")

由于您可能需要多个正则表达式,因此最好将其创建封装在函数中:

Function CreateRegExp(str)
  Set re = New RegExp
  re.Pattern    = str
  re.IgnoreCase = True
  re.Global     = True

  Set CreateRegExp = re
End Function

然后你的代码可能看起来像这样:

Set re1 = CreateRegExp("1a")
Set re2 = CreateRegExp("2b")
Set re3 = CreateRegExp("3c")
Set re4 = CreateRegExp("4d")

'...

Function SeaRep()
  Dim nLine, sLine, nCount, outPut1, outPut2, outPut3
  nCount = 0
  Do Until oInStream.AtEndOfStream
    nLine = oInStream.Line
    sLine = oInStream.ReadLine

    outPut1 = re1.Replace(sLine, "foo")
    outPut2 = re2.Replace(outPut1, "foobar")
    outPut3 = re3.Replace(outPut2, "foosod")
    oOutStream.WriteLine (re4.Replace(outPut3, "fooyard"))

    nCount = nCount + 1
  Loop
  AddLineNum = nCount
End Function

答案 1 :(得分:-1)

对不起,如果我现在看到的话。 看一下您是否还不知道用php cli编写过滤器是很有可能的。 以防您了解php并想编写自定义EDITPLUS过滤器(如我所做的那样): 例如,我使用xampp(apachefriends.org),并且是标准安装在C:\ xampp上 在htdocs中,我有一个名为“ x”的文件夹,在该文件夹中,我有index.php

<?php 
//var_dump($argv);
//echo('daaaaaaaaaaa\r\n');
//echo "\n";
$cmd='';
if (isset($argc)) {
    for ($i = 0; $i < $argc; $i++) {

        //echo "\$argv[" . $i . "] - " . $argv[$i] . "\n";
        if($i>1) $cmd.=$argv[$i];
    }
}
else {
    echo "argc and argv disabled\n";
}
/*echo('da');*/
switch ($argv[1]) {
    case 'tool1':
        echo $argv[2].":from cmd tool 1\n";
        break;
    case 'tool2':
        echo $argv[2].":from cmd tool 2\n";
        break;
    case 'run':
        //echo $argv[2].":from cmd tool 2\n";

        echo $cmd.PHP_EOL.'//';
        eval($cmd);

        break;

    case 'bench':
        ob_start();
        $start= microtime(true);
        for($i=0;$i<1000;$i++)  eval($cmd);
        $stop= microtime(true);
        ob_clean ();
        echo $cmd.PHP_EOL.'//';
        echo $stop-$start;


        break;

}

?>

在Editplus中,顶部有菜单: 工具/首选项/用户工具,然后添加工具..程序,所以现在您应该在底部有一张表格可以填写!把这些:

Menu text: bench ( <--- write something ,i put bench)
Command: "c:\xampp\php\php.exe"
Argument: "c:\xampp\htdocs\x\index.php" bench $(CurSel)
Initial:
Action: Run as Text FIlter(Replace)

如果需要,可以放置图标(我进行了一些更改,以便每次我打开html,php,javascript ...时,用户工具都会出现在我的编辑器中,因此我直接单击该按钮以谈论图标)

因此,现在您在完成设置之前就已经阅读了该设置,只需打开一个新的php文件并复制粘贴即可:

<?php 



echo 'hi from php!';



?>

现在不需要保存文件,只需选择echo 'hi from php!'; 现在点击用户工具栏上的“工作台”图标

如果一切设置都很好(xampp,设置和服务器不应该启动,因为通过在php cli上执行php脚本而导致工作),您将得到如下结果:

您选择的php代码将被php执行1000次,您会花费时间

echo'hifromphp!';
//0.0016298294067383

===================== 现在,如果您在index.php中更改一些代码

case 'bench':
        ob_start();
        $start= microtime(true);
        for($i=0;$i<1000;$i++)  eval($cmd);
        $stop= microtime(true);
        ob_clean ();
        echo PHP_EOL.'//';
        echo $stop-$start;


        break;

,然后在Editplus中使用命令 运行为文本过滤器(插入),结果不会影响代码行(如之前)

echo 'hi from php!';
//0.0018229484558105
//0.0016310214996338
//0.0016298294067383

为了更精确...

case 'bench':
        ob_start();
        $start= microtime(true);
        for($i=0;$i<10000;$i++) eval($cmd);
        $stop= microtime(true);
        ob_clean ();
        echo PHP_EOL.'//';

        echo number_format(($stop-$start)/10000, 8, '.', '');

        break;

因此,即使在用户工具栏处于活动状态的情况下,即使在html文件或txt中选中行,您也可以在所选文本上执行php

以类似的方式,您可以重新编码所需的内容或新内容。 这只是简单的方法,但是如果您知道其他编译语言的任何编程,则可以编写带有cmd参数的可执行文件。 在其他人使用c,c ++,.. c的基础上,我使用freebasic.net或purebasic.com(以防我想隐藏一些代码,我需要远离有害人员)。 祝你好运!

这只是使用php cli编写自己的正则表达式的方法:不要期望我们会为您编写它。.您可以像真正的程序员一样尝试一下(不管您是谁:是没有适合拉默的地方