我有这个逻辑编程软件,可以用以下格式输出文本文件中的结果:
[-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或批处理(是的我在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
答案 0 :(得分:2)
匹配嵌套括号对于正则表达式来说总是一件棘手的事情,因为递归结构不是常规的。但是在你的例子中,你可以简单地找到两个开括号相互跟随而没有插入右括号的行:
if (/\([^()]*\(/.test(line)) {
// discard line
} else {
// keep line
}
<强>解释强>
\( # Match (
[^()]* # Match any number of characters except parentheses
\( # Match another (
答案 1 :(得分:2)
使用grep
grep -v '([^()]*(' file.txt
答案 2 :(得分: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 $_;
}
}
在我看来,install Perl使用它来解决问题比在VBScript中尝试这样做要快得多。 (是的,我有偏见,但Perl是一个非常优秀的工具)。