括号内的正则表达式括号

时间:2012-10-23 12:32:26

标签: java regex string windows vbscript

我有这个逻辑编程软件,可以用以下格式输出文本文件中的结果:

[-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

3 个答案:

答案 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是一个非常优秀的工具)。