0

我有这个逻辑编程软件,可以将结果输出为以下形式的文本文件:

[-a(b), +i(c), +i(d)] 
[-a(f(g(a))), -a(f(a,b)), -a(f(c)), -a(f(d)), -a(b)]
...

它可以扩展到数百或数千行。

我只是希望能够通过删除包含括号内的括号(换句话说,谓词内的函数)的行来缩小这个数字,就像-a(f(g(a)))-a(f(c))......并保留所有其他行。

任何人都可以指导我,也许可以为我提供一个简单的例子,说明如何以最简单的方式实现这一点,一点也不花哨,可能是在 VBScript 或 Batch 中(是的,我在 Windows 上),它读取文本文件的内容和删除未分配的行。

编辑:vbs 工作示例

Dim re, targetString
Set re = New RegExp
With re
  .Pattern = "\([^()]*\("
  .Global = False
  .IgnoreCase = False
End With

targetString = "[-a(f(g(a))), -a(f(a,b)), -a(f(c)), -a(f(d)), -a(b)]"

if re.Test(targetString) <> True Then
    MsgBox "valid",0,"test"
else
    MsgBox "invalid",0,"test"
end if
4

3 回答 3

2

匹配嵌套括号对于正则表达式来说总是一件棘手的事情,因为递归结构不是规则的。但是在您的示例中,您可以简单地查找两个左括号彼此跟随而没有中间右括号的行:

if (/\([^()]*\(/.test(line)) {
    // discard line
} else {
    // keep line
}

解释:

\(     # Match (
[^()]* # Match any number of characters except parentheses 
\(     # Match another (
于 2012-10-23T12:42:03.280 回答
2

使用 grep

grep -v '([^()]*(' file.txt
于 2012-10-23T12:45:52.027 回答
0

这是一个完整的 Perl 解决方案:

use strict;
use warnings;

open IN, 'in.txt' or die "can't open input file";
open OUT, '>out.txt' or die "can't open output file";

while (<IN>)
{
   unless (/([\(]\w*){2}/)
   {
       print OUT $_;
   }
}

在我看来,安装 Perl并使用它来解决您的问题比尝试在 VBScript 中执行此操作要快得多。(是的,我有偏见,但 Perl 是一个非常优秀的工具)。

于 2012-10-23T12:47:23.480 回答