0

我能够拼凑下面的代码,以便它执行多个搜索和替换功能作为文本过滤器。该代码适用于 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
4

2 回答 2

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
于 2013-03-15T23:54:18.133 回答
-1

抱歉,如果我现在看到了。看看你是否还不知道用 php cli 编写你的过滤器是很有可能的。如果您知道 php 并且想要编写自定义 EDITPLUS 过滤器(就像我所做的那样):例如,我使用 xampp (apachefriends.org) 并且标准安装在 htdocs 中的 C:\xampp 我有一个名为 let say "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 中,Run As Text Filter (insert) 中的命令结果不会影响代码行(像以前一样)

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编写您自己的正则表达式的方法:不要指望我们会为您编写它..您可以像真正的程序员一样尝试自己(无论您是谁:不适合lamers)

于 2020-04-16T16:02:10.127 回答